CAS 的原理
CAS 全称是 compare and swap (比较并且交换),是一种用于在多线程环境下实现同步功能的机制,其也是无锁优化,或者叫自旋,还有自适应自旋。
在 jdk 中,CAS 加 volatile
关键字作为实现并发包的基石。没有 CAS 就不会有并发包,java.util.concurrent
中借助了 CAS 指令实现了一种区别于 synchronized 的一种乐观锁。
乐观锁的一种典型实现机制(CAS):
乐观锁主要就是两个步骤:
- 冲突检测
- 数据更新
当多个线程尝试使用 CAS 同时更新同一个变量时,只有一个线程可以更新变量的值,其他的线程都会失败,失败的线程并不会挂起,而是告知这次竞争中失败了,并可以再次尝试。
在不使用锁的情况下保证线程安全,CAS实现机制中有重要的三个操作数:
- 需要读写的内存位置(V)
- 预期原值(A)
- 新值(B)
首先先读取需要读写的内存位置 (V),然后比较需要读写的内存位置 (V) 和预期原值 (A),如果内存位置与预期原值的 A 相匹配,那么将内存位置的值更新为新值B。如果内存位置与预期原值的值不匹配,那么处理器不会做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该位置的值。
具体可以分成三个步骤:
- 读取(需要读写的内存位置(V)&