返回

以简释繁:JAVA锁原理之CAS原子操作篇

前端

在计算机科学中,原子操作是指由多步操作组成的一个操作。如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。现代操作系统中,一般都提供了原子操作来实现一些同步操作,所谓原子操作,也就是一个独立而不可分割的操作。

在Java中,CAS(Compare And Swap)是一种非阻塞同步机制,它通过比较和交换两个值来实现原子操作。CAS操作的步骤如下:

  1. 读出一个变量的值V。
  2. 比较V与期望值E是否相等。
  3. 如果相等,则将V更新为新的值N。
  4. 如果不相等,则不更新V,并返回V的原始值。

CAS操作可以用于实现各种同步操作,例如自旋锁、互斥锁和读写锁。CAS操作的优点是它是非阻塞的,这意味着它不会导致线程阻塞。CAS操作的缺点是它只能用于更新单个变量,如果要更新多个变量,则需要使用其他同步机制。

下面是一个使用CAS操作实现自旋锁的例子:

public class SpinLock {

    private volatile boolean locked = false;

    public void lock() {
        while (true) {
            if (!locked) {
                if (CAS(locked, false, true)) {
                    break;
                }
            }
        }
    }

    public void unlock() {
        locked = false;
    }

    private boolean CAS(boolean expectedValue, boolean currentValue, boolean newValue) {
        return Unsafe.compareAndSwapInt(this, LOCKED_OFFSET, expectedValue, newValue);
    }

    private static final long LOCKED_OFFSET = Unsafe.objectFieldOffset(SpinLock.class, "locked");
    private static final Unsafe UNSAFE = Unsafe.getUnsafe();
}

在上面的例子中,locked变量是一个volatile变量,它表示锁的状态。lock()方法使用CAS操作来获取锁。如果locked变量的值为false,则将locked变量的值更新为true,并返回true。如果locked变量的值不为false,则不更新locked变量的值,并返回false。unlock()方法将locked变量的值更新为false,释放锁。

CAS操作是一种非常重要的同步机制,它广泛用于Java并发编程中。