以 AtomicInteger 的 addAndGet 方法为例。
计算机有一个 xchg 指令,它可以原子性的交换内存和寄存器的值。
1、调用 addAndGet 方法时,先获取原子变量当前值并加一存在寄存器中。
2、使用 xchg 指令把这个值跟内存中变量的值交换。
假如内存中当前值是 7,那么使用 xchg 指令之后内存中的值会变成 8,而寄存器中的值变成 7。
3、把寄存器中返回的值跟第一次读取到的变量值 7 对比。
如果相等说明没有其它线程在这个 读-改 操作中修改过内存中变量的值,把寄存器中返回的值加一并返回。
如果两个值不相等,重复 1-2-3 步骤。
Cas 被称为乐观锁,它假设不会有多个线程同时修改变量的值。如果有,就基于新值重新修改变量。
如果一个线程在执行 1 步骤后有其它线程把内存中的值从 7 改成别的值,再改成 7,那么这个线程对此是无感知的。