java cas

CAS 操做包含三个操做数 —— 内存位置(V)、预期原值(A)和新值(B)。 html

 

利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法。其它原子操做都是利用相似的特性完成的。而整个J.U.C都是创建在CAS之上的,所以对于synchronized阻塞算法,J.U.C在性能上有了很大的提高。java

 

CAS存在的问题算法

1.  ABA问题。经过递增来避开ABA的问题,就是每次改变都不会重复。在JDK的java.util.concurrent.atomic包中提供了AtomicStampedReference来解决ABA问题,该类检查了当前引用与当前标志是否与预期相同,若是所有相等,才会以原子方式将该引用和该标志的值设为新的更新值,这样CAS操做中的比较就不依赖于变量的值了。异步

    https://www.cnblogs.com/549294286/p/3766717.html性能

2. 循环时间长开销大。 自旋CAS若是长时间不成功,会给CPU带来很是大的执行开销atom

3. 只能保证一个共享变量的原子操做线程

Java的CAS会使用现代处理器上提供的高效机器级别原子指令,这些原子指令以原子方式对内存执行读-改-写操做,这是在多处理器中实现同步的关键(从本质上来讲,可以支持原子性读-改-写指令的计算机器,是顺序计算图灵机的异步等价机器,所以任何现代的多处理器都会去支持某种能对内存执行原子性读-改-写操做的原子指令)。同时,volatile变量的读/写和CAS能够实现线程之间的通讯。把这些特性整合在一块儿,就造成了整个concurrent包得以实现的基石。若是咱们仔细分析concurrent包的源代码实现,会发现一个通用化的实现模式:htm

  1. 首先,声明共享变量为volatile;
  2. 而后,使用CAS的原子条件更新来实现线程之间的同步;
  3. 同时,配合以volatile的读/写和CAS所具备的volatile读和写的内存语义来实现线程之间的通讯。
相关文章
相关标签/搜索