iT邦幫忙

0

[Java] 比較並交換 compare-and-swap (CAS) 介紹

閱讀時間: 5分鐘

CAS是原子操作的一種,可用於在多執行緒編程中實現不被打斷的數據交換操作,從而避免多執行緒同時改寫某一數據時由於執行順序不確定性以及中斷的不可預知性產生的數據不一致問題。
該操作通過將內存中的值與指定數據進行比較,當數值一樣時將內存中的數據替換為新的值。

CAS是由CPU硬體實現,所以執行相當快。

CAS有3個操作數:

  • 內存值M (記憶體地址)
  • 現時的預期值A
  • 將要修改的新值B

當且僅當預期值A和內存值M相同時,就會自動地將內存值M修改為B,否則什麽都不做保持現狀。
CAS的關鍵點在於,系統在硬件層面保證了比較並交換(CAS)操作的原子性,
處理器使用基於對緩存加鎖或總線加鎖的方式來實現多處理器之間的原子操作。
當我們返回M值時,其實它已經經歷了3個步驟包括獲得數值、比較數值、更新數值。
而這3個步驟被視作一個machine level的操作。
從而保證了它的原子性。

另外,當有多個Thread嘗試存取更新同一個值時,CAS只容許一個Thread有修改的權限。
而其他Thread就會被即時通知它們的行動失敗,叫它們回家。

例子:

    public final long getAndIncrement() {
        while (true) {
            long current = get();
            long next = current - 1;
            //當-1操作成功的時候直接返回,退出此迴圈
            if (compareAndSet(current, next))
                return current;
        }
    }
    //呼叫JNI實現CAS
    public final boolean compareAndSet(long expect, long update) {
    return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
    }

參考文章/網站/書本:


尚未有邦友留言

立即登入留言