CAS:compare and swap(比较并交换)
1.在接触原子类的时候,我们接触了CAS机制,它的原理:
我们在看一下CAS的公式。
CAS(V,A,B)
1:V表示内存中的地址
2:A表示预期值
3:B表示要修改的新值
CAS的原理就是预期值A与内存中的值相比较,如果相同则将内存中的值改变成新值B。这样比较有两类:
第一类:如果操作的是基本变量,则比较的是 值 是否相等。
第二类:如果操作的是对象的引用,则比较的是对象在 内存的地址 是否相等。
2.CAS是Java乐观锁的一种实现机制:
在Java并发包中,大部分类就是通过CAS机制实现的线程安全,它不会阻塞线程,如果更改失败则可以自旋重试,但是它也存在很多问题:
1:ABA问题,也就是说从A变成B,然后就变成A,但是并不能说明其他线程并没改变过它,利用CAS就发现不了这种改变。
2:由于CAS失败后会继续重试,导致一致占用着CPU。
3.原子类的实现原理:
(1)CAS + Volatile + native(本地方法)
(2)通过UnSafe类的本地方法objectFiledOffset()获取原本值的内存地址,由这个地址值去和预期值
进行比较并修改,另外修改的值value用Volatile修饰,保证任何线程获取的值都是最新的值。