一個例子解釋 java種CAS 的ABA問題

 

線程I使用CAS修改初始值爲A的變量X,那麼線程I會首先去獲取當前變量X的值(爲A〕,然後使用CAS操作嘗試修改X的值爲B,如果使用CAS操作成功了,那麼程序運行一定是正確的嗎?其實未必,這是因爲有可能在線程I獲取變量X的值後,在執行CAS前,線程I I使用CAS修改了變量X的值爲B,然後又使用CAS修改了變量X的值爲A。所以雖然線程I執行CAS時X的值是A,但是這A己經不是線程I獲取時的A了。這就是ABA問題。ABA題的產生是因爲變量的狀態值產生了環形轉換,就是變量的值可以從A到B ,然後再從B到A。如果變量的值只能朝着一個方向轉換,比如A到,B到C不構成環形,就不會存在問題。JDK中的A t o m i c S t a m p e d R e f e r e n c e類給每個變量的狀態值都配備了一個時間戳,從而避免了ABA問題的產生

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章