java中CAS实现的原理

  • 从书中看到java中可以通过CAS的方式实现原子操作。在这里用了JAVA提供的用于原子操作的atomic类中的atomicInteger。
  • 例子中的安全计数器代码如下:
private void safeCount(){
    for(::){
        int i = atomicI.get();
        boolean suc = atomicI.compareAndSet(i,++i);
        if(suc){
            break;
        }
    }
}
  • get()函数用于返回私有值value
 public final int get() {
        return value;
    }

  • value在AtomicInteger对象初始化时赋值,默认为0

public AtomicInteger(int initialValue) {
        value = initialValue;
    }
  • 地址VALUE为static final类型,一旦声明不能更改,VALUE地址与私有变量value绑定。
private static final jdk.internal.misc.Unsafe U = jdk.internal.misc.Unsafe.getUnsafe();
private static final long VALUE = U.objectFieldOffset(AtomicInteger.class, "value");
  • 经过源码的查看,其中atomicI.compareAndSet()函数如下
public final boolean compareAndSet(int expectedValue, int newValue) {
        /**
         *这个函数的作用为将expectedValue的值与VALUE地址上的值做比较,相同则执行成功,否则失败
         *@param VALUE 地址
          @param expectedValue 期望的值
          @param newValue 新值
         *@return 若执行成功则将expectedValue的值替换为newValue,并返回true
                  否则返回false
         */
        return U.compareAndSetInt(this, VALUE, expectedValue, newValue);
    }

JAVA中的CAS操作都是通过sun包下Unsafe类实现,而Unsafe类中的方法都是native方法,由JVM本地实现,经过继续深入,可以发现最终CAS操作由CPU的操作
cmpxchg实现,具体可以去了解这个操作的用法,这里就不继续深入了。

猜你喜欢

转载自blog.csdn.net/zhuochuyu7096/article/details/85333022