返回
以简释繁:JAVA锁原理之CAS原子操作篇
前端
2024-01-10 16:12:39
在计算机科学中,原子操作是指由多步操作组成的一个操作。如果该操作不能原子地执行,则要么执行完所有步骤,要么一步也不执行,不可能只执行所有步骤的一个子集。现代操作系统中,一般都提供了原子操作来实现一些同步操作,所谓原子操作,也就是一个独立而不可分割的操作。
在Java中,CAS(Compare And Swap)是一种非阻塞同步机制,它通过比较和交换两个值来实现原子操作。CAS操作的步骤如下:
- 读出一个变量的值V。
- 比较V与期望值E是否相等。
- 如果相等,则将V更新为新的值N。
- 如果不相等,则不更新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并发编程中。