码迷,mamicode.com
首页 > 其他好文 > 详细

CAS 无锁优化

时间:2020-07-10 00:00:55      阅读:69      评论:0      收藏:0      [点我收藏+]

标签: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

  

CAS 无锁优化

标签:expect   instance   atom   就会   直接   expec   ldo   off   版本   

原文地址:https://www.cnblogs.com/chen-xing-Eli/p/13276943.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!