阿神2017-04-18 10:42:51
就如題主所說的,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;
這裡,unsafe
的objectFieldOffset
方法是拿到物件的記憶體偏移量,也就是透過這裡的比較即可判斷是否同一個物件位址。
所以,下結論:
Atomic原子類CAS操作比較的是記憶體偏移量,即記憶體位址。