原子類的 ABA 問題

2022-07-01 21:33:15 字數 1149 閱讀 3677

public

class

atomicreferencedemo

}

/**

* 當有乙個值從 a 改為 b 又改為 a,這就是 aba 問題

**/public

class

abademo ).start();

new thread(() ->

catch

(interruptedexception e)

atomicreference.compareandset(100, 2019);

system.out.println(atomicreference.get());

//2019

}).start();

}}

/**

* 我們先保證兩個執行緒的初始版本為一致,後面修改是由於版本不一樣就會修改失敗

**/public

class

abademo2

catch

(interruptedexception e)

atomicstampedreference.compareandset(100, 101, atomicstampedreference.getstamp(), atomicstampedreference.getstamp() + 1);

atomicstampedreference.compareandset(101, 100, atomicstampedreference.getstamp(), atomicstampedreference.getstamp() + 1);

}).start();

new thread(() ->

catch

(interruptedexception e)

boolean b = atomicstampedreference.compareandset(100, 2019, stamp, stamp + 1);

system.out.println(b);

//false

system.out.println(atomicstampedreference.getreference()); //

100}).start();

}}

CAS如何實現原子性與ABA問題

cas 全稱是 compare and swap 比較並且交換 是一種用於在多執行緒環境下實現同步功能的機制,其也是無鎖優化,或者叫自旋,還有自適應自旋 說法不算準確,底層還是存在鎖,後面會講 以atomicinteger類的compareandset方法舉例。其原始碼 expect與舊值一致,則用...

多執行緒原子性 CAS以及ABA問題

通常情況下為了保證安全,在乙個執行緒對乙個數值訪問時要上鎖,但是為了保證效率,cas中是不上鎖的。列如 現在有乙個值為0,讀取這個值,並且將其存在e中,則 e 0。然後對e進行遞增運算,有計算結果設為v。e 後,設乙個新的值為n 即 n e 這時去檢視e,如果e還是為0,則表明沒有其他的執行緒修改e...

原子類的分類

作用 保證併發安全,相比於鎖,具有一定的優勢 粒度更細 可以把競爭範圍縮小到變數級別 效率更高 除了高度競爭的情況,使用原子類的效率比鎖更高。可以對普通變數進行公升級 使用場景 偶爾需要get和set操作 注意點 longadder效率比atomiclong要高。atomiclong 每做一次加法運...