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