1. 程式人生 > >java中CAS實現的原理

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實現,具體可以去了解這個操作的用法,這裡就不繼續深入了。