原子变量原理

493 阅读1分钟

以 AtomicInteger 的 addAndGet 方法为例。

计算机有一个 xchg 指令,它可以原子性的交换内存和寄存器的值。

1、调用 addAndGet 方法时,先获取原子变量当前值并加一存在寄存器中。

2、使用 xchg 指令把这个值跟内存中变量的值交换。

假如内存中当前值是 7,那么使用 xchg 指令之后内存中的值会变成 8,而寄存器中的值变成 7。

3、把寄存器中返回的值跟第一次读取到的变量值 7 对比。

如果相等说明没有其它线程在这个 读-改 操作中修改过内存中变量的值,把寄存器中返回的值加一并返回。

如果两个值不相等,重复 1-2-3 步骤。

Cas 被称为乐观锁,它假设不会有多个线程同时修改变量的值。如果有,就基于新值重新修改变量。

如果一个线程在执行 1 步骤后有其它线程把内存中的值从 7 改成别的值,再改成 7,那么这个线程对此是无感知的。