AtomicReference安全
經過volatile和Unsafe提供的CAS函數實現原子操做。 自旋+CAS的無鎖操做保證共享變量的線程安全函數
可是CAS操做可能存在ABA問題。AtomicStampedReference的出現就是爲了解決這問題spa
AtomicStampedReference線程
構造方法中initialStamp(時間戳)用來惟一標識引用變量,在構造器內部,實例化了一個Pair對象,Pair對象記錄了對象引用和時間戳信息,採用int做爲時間戳,實際使用的時候,要保證時間戳惟一(通常作成自增的),若是時間戳若是重複,還會出現ABA的問題。code
AtomicStampedReference中的每個引用變量都帶上了pair.stamp這個時間戳,這樣就能夠解決CAS中的ABA的問題。對象
/**
* Creates a new {@code AtomicStampedReference} with the given
* initial values.
*
* @param initialRef the initial reference
* @param initialStamp the initial stamp
*/
public AtomicStampedReference(V initialRef, int initialStamp) {
pair = Pair.of(initialRef, initialStamp);
}
AtomicMarkableReference
AtomicStampedReference能夠知道,引用變量中途被更改了幾回。有時候,咱們並不關心引用變量更改了幾回,只是單純的關心是否更改過,因此就有了AtomicMarkableReference。
AtomicMarkableReference的惟一區別就是再也不用int標識引用,而是使用boolean變量——表示引用變量是否被更改過。
構造函數
/**
* Creates a new {@code AtomicMarkableReference} with the given
* initial values.
*
* @param initialRef the initial reference
* @param initialMark the initial mark
*/
public AtomicMarkableReference(V initialRef, boolean initialMark) { pair = Pair.of(initialRef, initialMark);}