compare and swap ABA 問題和解決方案

CAS ABA 問題圖解

在這裏插入圖片描述

如上圖所示三個線程 T1,T2,T3 更新內存中的值 V。具體執行時刻沿着時間線。

  1. T1T2 同時讀取到內存中的值 V,保存到線程私有變量 A 此時 A的值爲 100
  2. T1 線程的 A = 100 (也就是當前線程私有保存的 V 的一份拷貝),計算 B = A - 50, 此時比較 A 和 V 相等,將 V 的值更新爲 50
  3. T2 被阻塞。
  4. T3 讀取到 V = 50,保存在 A 中。計算 B = A + 50 = 100,比較 A 和 V 的值,相等。將 V 的值更新爲 100。注意此時內存中的 V 的值經歷了從 100->50->100 的過程,這就是所謂的 ABA 問題
  5. T2 接着執行,計算 B = A - 50 = 50。比較 A 和 V 的值,相等。將V 的值更新爲 50

解決方案

本質原因:內存中 V 的值經過了改變,又變回了原值。但是沒有記錄這個信息。
怎麼辦?
加一個版本號來記錄 V 的版本。這就是代價,要表示這個變化過程的代價。

解決 ABA 問題圖解

CAS 更新成功條件

  1. V = A
  2. 版本相同
    在這裏插入圖片描述
  3. 可以看到 T1 和 T2 讀取到的 version 都是 01
  4. T1 執行完成後,更新內存中 V 的值爲 50,版本號爲 02
  5. T3 執行完成後,更新內存中 V 的值爲 100,版本號爲 03
  6. T2 讀取到的 version 是 01,but 此時內存中的 version 是 03,版本不匹配 T2 更新失敗。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章