无冥冥之志者,无昭昭之明;无惛惛之事者,无赫赫之功。
 解释:没有专心致志地刻苦学习,就没有融会贯通的智慧;没有埋头执着的工作,就不会取得显著的成就。

    Java中的CAS操作是一个原子操作,由CPU提供。CAS操作的意思是Compare And Swap,即比较交换。本来比较、交换应该不是原子的,但是CPU的厂商,针对这些情况,加入来一些原语,使得在硬件层面支持CAS。

CAS的实现

    CAS包含三个操作数:内存地址、预期值、新值。

    读取内存地址中的值作为旧值,如果旧值与预期值相同,则把新值写入内存地址中。如果旧值与预期值不相同,则不做任何操作。不管更新是否成功,CAS会返回当前地址的值。

Java中CAS的原理

    Java中的CAS操作通过JNI调用底层的C代码,进而调用CPU的指令。CAS操作的时候,会一直循环进行CAS操作直到修改成功。

    调用方法在Unsafe类中

CAS存在的问题

  1. ABA问题
        ABA问题就是在多线程环境中,线程1把内存地址V的值读取出来为A,这时候线程2也将地址V的值读出来,并进行操作之后改为B,然后又改为了A。这个时候线程1再操作内存V的时候,发现地址V的值还是A。那么线程1其实发现不了这个问题。

    解决方法:JDK5以后,atomic包里提供了一个类AtomicStampedReference来解决ABA问题,首先检测引用是否相同,然后检测引用标志是否相同,只有都相同的情况下,才会更新。

  2. CAS长时间自旋问题 由于Java层的CAS操作会有一个循环进行CAS操作,那么如果长时间无法成功,就会一直处于循环中,比较消耗性能。

Java的concurrent包

    Java里面的concurrent包结合了volatile和CAS操作,来实现优化同步操作。

具体实现的步骤:

  1. 定义volatile变量
  2. 使用CAS的原子条件更新来实现线程之间的同步
  3. 使用volatile的读写可见性及CAS的原子性修改

参考 : Java CAS详解

results matching ""

    No results matching ""