java - AtomicReference<V> compareAndSwap是比较对象的地址吗
PHPz
PHPz 2017-04-18 10:40:51
0
2
508
PHPz
PHPz

学习是最好的投资!

全部回覆(2)
伊谢尔伦

是位址,準確的說是this物件的記憶體valueOffset的位置的值和expect比較.
Unsafe詳解

阿神

就如題主所說的,AtomicInteger源码是比较并替换Integer来实现线程安全性。而AtomicReference是相較於物件所引用的比較並替換。這些都是原子類CAS實作。

至於是不是比較地址,先拿題主所說的AtomicReference入手,知道下面的方法:

public final boolean compareAndSet(V expect, V update) {
    return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
}

底層實現在Unsafe类中,是一个native本地方法。Unsafe的CAS包括了三个操作数--需要读写的内存位置valueOffset,进行比较的值expected,拟定写入的新值update。當且僅當在記憶體位置V所儲存的值等於比較的值A時,CAS才會以原子方式以新值來更新記憶體位址的舊值。否則不進行任何操作。

關鍵在於傳入的valueOffset的作用,繼續查看valueOffset的作用,继续查看AtomicReference源碼:

static {
  try {
    valueOffset = unsafe.objectFieldOffset
        (AtomicReference.class.getDeclaredField("value"));
  } catch (Exception ex) { throw new Error(ex); }
}

private volatile V value;

這裡,unsafeobjectFieldOffset方法是拿到物件的記憶體偏移量,也就是透過這裡的比較即可判斷是否同一個物件位址。

所以,下結論:

Atomic原子類CAS操作比較的是記憶體偏移量,即記憶體位址。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板