亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java并發編程之cas的示例分析

發布時間:2021-08-11 10:46:16 來源:億速云 閱讀:169 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關java并發編程之cas的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

CAS(Compare and swap)比較和替換是設計并發算法時用到的一種技術。簡單來說,比較和替換是使用一個期望值和一個變量的當前值進行比較,如果當前變量的值與我們期望的值相等,就使用一個新值替換當前變量的值。

CAS的使用場景

在程序和算法中一個經常出現的模式就是“check and act”模式。先檢查后操作模式發生在代碼中首先檢查一個變量的值,然后再基于這個值做一些操作。下面是一個簡單的示例:

class MyLock {
  private boolean locked = false;
  public boolean lock() {
    if(!locked) {
      locked = true;
      return true;
    }
    return false;
  }
}

上面這段代碼,如果用在多線程的程序會出現很多錯誤,不過現在請忘掉它。

如你所見,lock()方法首先檢查locked>成員變量是否等于false,如果等于,就將locked設為true。

如果同個線程訪問同一個MyLock實例,上面的lock()將不能保證正常工作。如果一個線程檢查locked的值,然后將其設置為false,與此同時,一個線程B也在檢查locked的值,又或者,在線程A將locked的值設為false之前。因此,線程A和線程B可能都看到locked的值為false,然后兩者都基于這個信息做一些操作。

為了在一個多線程程序中良好的工作,”checkthenact”操作必須是原子的。原子就是說”check“操作和”act“被當做一個原子代碼塊執行。不存在多個線程同時執行原子塊。

下面是一個代碼示例,把之前的lock()方法用synchronized關鍵字重構成一個原子塊。

class MyLock {
  private boolean locked = false;
  public synchronized boolean lock() {
    if(!locked) {
      locked = true;
      return true;
    }
    return false;
  }
}

現在lock()方法是同步的,所以,在某一時刻只能有一個線程在同一個MyLock實例上執行它。

原子的lock方法實際上是一個”compare and swap“的例子。

CAS用作原子操作

現在CPU內部已經執行原子的CAS操作。Java5以來,你可以使用java.util.concurrent.atomic包中的一些原子類來使用CPU中的這些功能。

下面是一個使用AtomicBoolean類實現lock()方法的例子:

public static class MyLock {
  private AtomicBoolean locked = new AtomicBoolean(false);
  public boolean lock() {
    return locked.compareAndSet(false, true);
  }
}

locked變量不再是boolean類型而是AtomicBoolean。這個類中有一個compareAndSet()方法,它使用一個期望值和AtomicBoolean實例的值比較,和兩者相等,則使用一個新值替換原來的值。在這個例子中,它比較locked的值和false,如果locked的值為false,則把修改為true。

如果值被替換了,compareAndSet()返回true,否則,返回false。

使用Java5+提供的CAS特性而不是使用自己實現的的好處是Java5+中內置的CAS特性可以讓你利用底層的你的程序所運行機器的CPU的CAS特性。這會使還有CAS的代碼運行更快。

感謝各位的閱讀!關于“java并發編程之cas的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

瓮安县| 巢湖市| 雅江县| 天祝| 盘山县| 锡林郭勒盟| 牟定县| 离岛区| 梅州市| 龙口市| 开鲁县| 文昌市| 杭锦后旗| 沙雅县| 蓬莱市| 夹江县| 铁岭县| 施秉县| 汽车| 周宁县| 理塘县| 潞西市| 鹤庆县| 仲巴县| 丁青县| 临桂县| 江北区| 辉县市| 唐河县| 兰西县| 柳河县| 庄河市| 恭城| 墨脱县| 星子县| 安远县| 杭锦旗| 尖扎县| 广宁县| 逊克县| 改则县|