CAS
CAS(compare and swap)比较并交换
用于实现乐观锁,被广泛应用于各大框架中。
CAS 的思想很简单,就是给一个元素赋值的时候,先看看内存里的那个值到底变没变,如果没变我就修改,
变了我就不改了,其实这是一种无锁操作,不需要挂起线程,无锁的思路就是先尝试,如果失败了,进行补偿,
也就是你可以继续尝试。这样在少量竞争的情况下能很大程度提升性能
CAS在计算机底层也是三个动作:【取值】、【比较】、【赋值】,只不过这三个动作是CPU原语级别的原子动作!
import java.util.concurrent.atomic.AtomicInteger;
public class CASExample {
// 创建一个 Atomic 原子整型变量,初始值为 0
private static AtomicInteger value = new AtomicInteger(0);
public static void main(String[] args) {
// 打印初始值
System.out.println("初始值: " + value.get());
// 模拟多个线程对 value 进行自增操作
for (int i = 0; i < 10; i++) {
new Thread(() -> {
int oldValue, newValue;
do {
// 读取当前值
oldValue = value.get();
// 计算新值
newValue = oldValue + 1;
// 尝试使用 CAS 算法将新值设置到原子变量中
} while (!value.compareAndSet(oldValue, newValue)); // CAS 操作,如果失败则重试
}).start();
}
// 等待所有线程执行完成
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 打印最终值
System.out.println("最终值: " + value.get());
}
}
我们创建了一个 Atomic 原子整型变量 value,初始值为 0。然后,我们启动了 10 个线程,每个线程都尝试对 value 进行自增操作。在每次自增操作之前,线程会先读取当前的值,然后计算出新值,并使用 CAS 算法尝试将新值设置到原子变量中。如果 CAS 操作失败(即有其他线程修改了变量的值),则线程会重新读取当前值,并再次尝试 CAS 操作,直到成功为止。
我们打印出了 value 的最终值,它是经过多个线程并发自增操作后的结果。CAS 算法确保了并发自增操作的原子性和线程安全性