CAS的ABA有沒有必要解決?
什么是ABA問題?
? ABA示例:
? 1).在多線程的環(huán)境中,線程a從共享的地址X中讀取到了對象A。
? 2).在線程a準(zhǔn)備對地址X進(jìn)行更新之前,線程a掛起。線程b將地址X中的值修改為了B。
? 3).接著線程b或者線程c將地址X中的值又修改回了A。
? 4).線程a恢復(fù),接著對地址X執(zhí)行CAS,發(fā)現(xiàn)X中存儲的還是對象A,對象匹配,CAS成功。ABA問題需不需要解決?
? 如果依賴中間變化的狀態(tài),需要解決。如果不是依賴中間變化的狀態(tài),對業(yè)務(wù)結(jié)果無影響。解決ABA問題。
? ABA問題的解決思路就是使用版本號。在變量前面追加上版本號,每次變量更新的時候把版本號加一,那么A-B-A 就會變成1A-2B-3A。
? 從Java1.5開始JDK的atomic包里提供了AtomicStampedReference和AtomicMarkableReference類來解決ABA問題。
評論
圖片
表情
