CAS 无锁优化
Posted chen-xing-eli
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CAS 无锁优化相关的知识,希望对你有一定的参考价值。
一、AtomXXX类
解决多线程问题的更高效的方法,使用Atom类
Atom类本身方法都是原子性的,但不能够保证多个方法连续调用都是原子性的.
atom类的底层实是cas
二、CAS(Compare And Set)
cas(V(要改的值),Expected(期望当前值),NewValue(新的值))
if V=E
V=New
otherwise try again or fail
如果要改的值和期望值不一样就会自旋(再次尝试)
在if V=E 执行完之后,还没来得及 V=New的时候令一个线程把值改了怎么办?
CAS的底层是Unsafe类操作是CPU原语支持,中间不能被打断
三、ABA问题
第一个线程进来时是1,它的期望值也是1
第二个线程进来改成了2
第三个线程进来把2改成了1
这是对于第一个线程来说正好改成了他的期望值,只是cas是正常执行的.
怎么避免ABA问题?
加版本号,cas(version). atomic类中atomicStampedReference加了版本号可以解决这个问题.
cas要改的值如果是基础类型的话ABA问题造成的影响不大,如果要改的值是引用的话引用中的引用被另外线程修改了的话,下面的逻辑可能会收到影响.
四、Unsafe类
直接操作虚拟机中的内存 allocateMemory putXX freeMemory pageSize
直接生成实例 allocateInstance
直接操作类或实例变量 objectFieldOffset/getInt/getObject
CAS相关操作CompareAndSwape
以上是关于CAS 无锁优化的主要内容,如果未能解决你的问题,请参考以下文章
Linux(程序设计):24---无锁CAS(附无锁队列的实现)
JMMsynchronized原理可见性有序性happens-beforeCAS(无锁并发)原子性 synchronized的优化