CAS
Compare and Swap先比拟再替换,CAS是一种无锁优化算法,也能够说是乐观锁,它基于共享数据不会被批改的假如,CAS有3个操作数,内存值V,旧的预期值A,要批改的新值B,当且仅当预期值A和内存值V雷同时,将内存值批改为B,否则什么都不做。
CAS的实现原理
1.在java层面,提供CAS的办法是在Unsafe类中应用native润饰的:
2.native是间接调用本地依赖库C++中的办法
3.在CAS底层,如果是多核的操作系统,须要追加一个lock指令,单核不须要加,因为cmpxchg是一行指令,不能再被拆分了
cmpxchg ,是汇编的指令,CPU硬件底层就反对 比拟和替换 (cmpxchg),cmpxchg并不保障原子性的。(cmpxchg的操作是不能再拆分的指令)
所以才会呈现判断CPU是否是多核,如果是多核就追加lock指令。
lock指令你能够了解为是CPU层面的锁,个别锁的粒度就是 缓存行 级别的锁,当然也有 总线锁 ,然而老本太高,CPU会依据状况抉择。
CAS中存在的问题
1.ABA
对于一般数据类型ABA不肯定是问题,因为他不会影像线程执行的最终后果。对于援用数据类型,能够指定版本号来解决,Java中的atomic包里提供了一个类AtomicStampedReference就是这样的。
2.自旋次数过长
如果CAS始终不胜利,自旋次数很大,会给CPU带来十分大的开销,能够限度自旋次数,比方synchronized,CAS失败肯定次数后,就会将线程挂起,防止占用过多的CPU资源。