AtomicReference,AtomicStampedReference與AtomicMarkableReference的區別


AtomicReference

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

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

但是CAS操作可能存在ABA問題。AtomicStampedReference的出現就是為了解決這問題

AtomicStampedReference

構造方法中initialStamp(時間戳)用來唯一標識引用變量,在構造器內部,實例化了一個Pair對象,Pair對象記錄了對象引用和時間戳信息,采用int作為時間戳,實際使用的時候,要保證時間戳唯一(一般做成自增的),如果時間戳如果重復,還會出現ABA的問題。

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);
}








免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM