标签:expect instance atom 就会 直接 expec ldo off 版本
一、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
标签:expect instance atom 就会 直接 expec ldo off 版本
原文地址:https://www.cnblogs.com/chen-xing-Eli/p/13276943.html