CAS(Compare and Swap ):
比较交换,不会真正阻塞线程,不断尝试更新。(乐观锁的一种实现方式)
假设当前主内存中的值为 V,工作内存中的值为 A,当前线程要修改的值为 B。
// address 主内存的值
// expectValue 工作内存的值
// swapValue 当前的值
boolean CAS(address, expectValue, swapValue) {
if (address == expectedValue) {
address = swapValue;
return true;
}
return false;
}
CAS的操作流程如下:
1.比较内存中的值 V 和当前工作内存的值 A 是否相等。
2.若相等,可以认为当前主内存的值没有被修改,当前线程就将值 B 写回主内存。
3.若不相等,说明当前线程的值A已经过时了(主内存已经发生了变化),将当前主内存的最新值 V 保存到当前工作内存中,此时无法将 B 写回主内存,继续循环。
CAS 是怎么实现的?
针对不同的操作系统,
JVM
用到了不同的
CAS
实现原理,简单来讲:
1).java 的
CAS
利用的的是
unsafe
这个类提供的
CAS
操作;
2).unsafe 的 CAS
依赖了的是
jvm
针对不同的操作系统实现的
Atomic::cmpxchg
;
3).Atomic::cmpxchg 的实现使用了汇编的 CAS
操作,并使用
cpu
硬件提供的
lock
机制保证其原子性。
简而言之,是因为
硬件予以了支持,软件层面才能做到
。
CAS的应用
1) 实现原子类
标准库中提供了
java.util.concurrent.atomic