ABA問題及解決

2021-10-07 03:12:10 字數 1671 閱讀 2130

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問題,當乙個位置被讀取兩次,兩次讀取具有相同的值,並且 值相同 用於指示 什麼都沒有改變 時。但是,另乙個執行緒可以在兩次讀取之間執行並更改值,執行其他工作,然後將值改回,因此,即使第二個執行緒的工作違反了該假設,也使第乙個執行緒認為 什麼都沒有改變 當多個執...