文章目錄
- ABA問題
- AtomicReference原子引用
- AtomicStampedRerference版本号原子引用
- ABA問題的解決
ABA問題
ABA問題是cas的缺點之一,由cas引出。
ABA問題:狸貓換太子
多個線程有處理的時間差,會導緻ABA問題,中間可以有很多個B(或者是C),隻不過首位是一樣的,那個慢的線程就認為沒改過,會繼續修改,傳回true,這個過程并不是沒有問題的,這就是aba問題。
AtomicReference原子引用
cas是隻管開頭和尾巴,對的上就ok,在一些環境下是沒問題的(如果你不介意的話,隻管結果不管過程),但是如果在一些環境裡,要求中間不能變就出現問題了。
JUC隻提供了原子基礎類型,如果我們想用atomicUser這種,JUC就不提供了。但是JUC提供了自己造的方法!
這是一個原子包裝的泛型類,丢一個User進去就變成了atomicUser了。
代碼示例:
如果你想對某個類進行原子包裝,可以參考這個類的寫法。
AtomicStampedRerference版本号原子引用
cas存在aba問題,想要解決,最直接的思路就是在剛開始擷取的時候,帶上時間,這樣最後比對的時候也比對時間,哪怕值一樣,時間不一樣,也對不上,不會修改。
上面是2個線程的執行個體,T2做了中間修改,T1想比對的時候值對的上,但是版本号明顯低于最新的,就得去重新擷取最新的。
加時間戳的cas類:
ABA問題的解決
這個對象維護了一個整形對象的時間戳,他們能夠被原子的更新,也就是版本号。
案例複現ABA問題:
結果:
修改成功了,但是發生了ABA問題,中間有存在某種問題或陰謀。
ABA問題解決: