什么是CAS?
CAS(Compare and Swap)比较并交换,一种乐观锁机制,是CPU级别的指令,能够保证操作的原子性,是Java并发包的基础。JDK在sun.misc包下Unsafe的类里提供了CAS相关的方法。
CAS实现原理
基于cmpxchg汇编指令实现。
CAS优缺点
优点
- 高效:硬件级别的原子操作,性能高;
- 保证操作的原子性;
缺点
- 不适用于高并发场景。CAS本质是乐观锁,在高并发场景,CAS操作失败的概率增加,极大的增加CPU开销;
- ABA问题。CAS在操作值的时候检查值是否已经变化,没有变化的情况下才会进行更新。但是如果一个值原来是A,变成B,又变成A,那么CAS进行检查时会认为这个值没有变化,但是实际上却变化了。ABA问题的解决方法是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A 就变成1A-2B-3A。从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。
参考: