CAS操作产生的ABA问题
生活随笔
收集整理的這篇文章主要介紹了
CAS操作产生的ABA问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
CAS操作產生的ABA問題
一:什么是ABA問題
兩個線程操作同一個賬戶時的場景。當線程1取錢時,先讀取余額為100,隨后通過CAS操作進行比較。然后,可能由于某些原因,線程1可能發生阻塞。與此同時,線程2同樣通過CAS機制,在線程1掛起時,在同一個賬戶上執行兩個操作。首先,改變原始值,改為90,這個值已經被線程1在剛才讀取。隨后線程2又將這個值改為原始值100。
一旦線程1恢復后,在線程1看來,沒有發生任何變化。cas將會執行成功。
因為例子中是獲取的是一個值類型(余額),所以最終未對結果造成影響!但若是引用類型,那兩個線程讀取到的可能就不是同一個對象了。
二:解決方案
1:AtomicStampedReference
2:AtomicMarkableReference
在原有類的基礎上,除了比較與修改期待的值外,增加了一個時間戳。對時間戳也進行CAS操作。這也稱為雙重CAS。從上例中看到。每次修改一個結點,其時間戳都發生變化。這樣即使共享一個復用結點,最終CAS也能返回正常的結果。
總結
以上是生活随笔為你收集整理的CAS操作产生的ABA问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序自定义swiper轮播图面板指
- 下一篇: 常见的Java内存溢出情况和实例