aba問hiyi題:
在多執行緒環境下,乙個執行緒需要修改共享變數的值,使用cas操作時,當其他執行緒將該共享變數由a該為b,再將b改為a後,這個執行緒依然可以cas操作成功,因為這個執行緒不能感知這個共享變數被修改過
解決方法:給共享變數增加乙個版本號,在cas操作時不僅比較值是否相等,還比較版本號是否相等,,,因為所有的執行緒使用共享變數時都遵循相同的規則:給版本號加1
**示例:
@slf4j
(topic =
"c.testaba"
)public
class
testaba
",stamp)
;other()
; timeunit.seconds.
sleep(3
);//嘗試改為c
log.
debug
("change a->c {}"
,ref.
compareandset
(prev,
"c",stamp,stamp+1)
);}private
static
void
other()
throws interruptedexception "
,ref.
compareandset
(ref.
getreference()
,"b"
,stamp,stamp+1)
);log.
debug
("{}"
,stamp);}
,"t1").
start()
; timeunit.seconds.
sleep(1
);newthread((
)->
",ref.
compareandset
(ref.
getreference()
,"a"
,stamp,stamp+1)
);log.
debug
("{}"
,stamp);}
,"t2").
start()
;}}
執行結果:
08:50:26.076 [main] debug c.testaba - main start…
08:50:26.078 [main] debug c.testaba - 0
08:50:26.119 [t1] debug c.testaba - changea->btrue
08:50:26.119 [t1] debug c.testaba - 0
08:50:27.125 [t2] debug c.testaba - changeb->atrue
08:50:27.125 [t2] debug c.testaba - 1
08:50:30.128 [main] debug c.testaba - change a->c false
結果分析:
一開始主線程先啟動,去獲取共享變數的值和版本號後,去呼叫other方法這個方法中啟動兩個執行緒去修改a與b的值,修改的規則一致:獲取當前值和版本號,用cas比較並設定,這個other()執行完成後,主線程再進行cas操作時發現版本號被修改,此次的cas將失敗: change a->c false
ABA問題的產生和解決
具體的aba產生的理論問題我就不闡述了。例項 public class abademo t1 start new thread catch interruptedexception e system.out.println atomicreference.compareandset 100 2019...
解決CAS演算法的 ABA 漏洞問題
在將如何去解決去解決cas的aba問題時,我們先來說一下什麼是cas,cas全稱 compare and swap cpu併發原語。執行是連續的,不允許被中斷,不會造成資料不一致問題。cas演算法 它包含三個引數cas v,e,n v表示要更新的變數,e表示預期值,n表示新值。僅當v值等於e值時,才...
簡介ABA問題
在多執行緒計算中,在同步期間會發生aba問題,當乙個位置被讀取兩次,兩次讀取具有相同的值,並且 值相同 用於指示 什麼都沒有改變 時。但是,另乙個執行緒可以在兩次讀取之間執行並更改值,執行其他工作,然後將值改回,因此,即使第二個執行緒的工作違反了該假設,也使第乙個執行緒認為 什麼都沒有改變 當多個執...