首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 並發編程:無鎖編程、CAS 與 ABA 問題

     編輯:Java 相關知識

定義

無鎖編程:在多線程環境下不使用鎖,避免線程阻塞,實現多變量同步,規避競態與死鎖。

原理:CAS (Compare-And-Swap / Compare-And-Set)

CAS 是原子操作,比較內存值與預期值,相等則更新為新值。偽代碼:

int compare_and_swap(int* reg, int oldval, int newval) {
    ATOMIC();
    int old_reg_val = *reg;
    if (old_reg_val == oldval) *reg = newval;
    END_ATOMIC();
    return old_reg_val;
}

實際使用 GCC 內建:__sync_bool_compare_and_swap、__sync_val_compare_and_swap。典型用法:

while (true) {
    int oldval = val;
    if (__sync_bool_compare_and_swap(&val, oldval, newval)) break;
}

ABA 問題

線程 P1 讀取值 A,被搶佔。P2 將值改為 B 再改回 A。P1 恢復執行 CAS 時發現值仍為 A,誤以為未被修改,導致邏輯錯誤。

解決方法

引入版本戳或標記位(tag/stamp),如 AtomicStampedReference,標記變量是否被修改過。

參考

  • Compare-and-swap
  • ABA problem
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved