全称:compare and swap,比较并交换。
虽然翻译过来是[比较并交换],但它是一个原子性的操作,对应到CPU指令为cmpxchg。

CAS有个缺点就是会带来ABA的问题。
从CAS更新的时候,我们可以发现它只比对当前值和内存值是否相等,这会带来个问题,下面我举例说明下:
要解决ABA的问题,Java也提供了AtomicStampedReference类供我们用,说白了就是加了个版本,比对的就是内存值+版本是否一致。
疑问:
为什么阿里巴巴开发手册提及到推荐使用 LongAdder 对象,比AtomicLong 性能更好(减少乐观锁的重试次数)?
原因:
因为AtomicLong做累加的时候实际上就是多个线程操作同一个目标资源。
在高并发时,只有一个线程是执行成功的,其他的线程都会失败,不断自旋(重试),自旋会成为瓶颈。
而LongAdder的思想就是把要操作的目标资源 分散,到数组Cell中。
每个线程对自己的 Cell 变量的 value 进行原子操作,大大降低了失败的次数。
这就是为什么在高并发场景下,推荐使用LongAdder 的原因。
对于LongAdder 的详解在这篇文章!!!--->为什么阿里推荐 LongAdder ,不推荐 AtomicLong ??