AtomicReference,AtomicStampedReference與AtomicMarkableReference的區別

AtomicReference安全

  經過volatile和Unsafe提供的CAS函數實現原子操做。 自旋+CAS的無鎖操做保證共享變量的線程安全函數

  1. value是volatile類型,這保證了:當某線程修改value的值時,其餘線程看到的value的值都是最新的值,即修改以後的volatile的值
  2. 經過CAS設置value。這保證了:某線程池經過CAS函數(如compareAndSet函數)設置value時,它的操做時原子性的,即線程在操做vu略時不會被中斷。

可是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);}
相關文章
相關標籤/搜索