CAS
比较并交换(CompareAndSwap, CAS)是原子性更新变量的一种方式。Java中将对变量的原子性操作封装成原子类。
1 | //AtomicInteger.java |
那么this.compareAndSwapInt(var1, var2, var5, var4)
再往下是什么呢?
最终在这个目录(/hotspot/src/os_cpu/linux_x86/vm/atomic_linux_x86.inline.hpp
)可以看到compareAndSwapInt使用了CPU的底层指令。以下是linux_x86平台的代码。
1 | // 如果是多核处理器的环境,需要在指令前加lock前缀 |
对于Intel平台,CPU使用cmpxchgl指令来完成该功能,但它并不是原子的。在多核环境下,需要加lock指令来保证原子性。那么lock指令会产生什么动作呢。在老CPU上面(486 < CPU < P6),Lock指令会锁总线,这样来自其他处理器的请求会被阻塞;在新CPU上面(CPU > P6),Lock指令不会锁总线,而是会使用缓存一致性协议(MESI)来保证原子性。
参考文献
Intel开发手册:https://software.intel.com/en-us/articles/intel-sdm