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 无锁优化的主要内容,如果未能解决你的问题,请参考以下文章

CAS无锁队列与线程同步

Java并发专题之三Java线程同步

锁——待优化

Linux(程序设计):24---无锁CAS(附无锁队列的实现)

CAS无锁队列的实现

JMMsynchronized原理可见性有序性happens-beforeCAS(无锁并发)原子性 synchronized的优化