91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

JAVA中哪些地方用到CAS

發布時間:2021-11-24 15:49:10 來源:億速云 閱讀:267 作者:iii 欄目:大數據

這篇文章主要講解了“JAVA中哪些地方用到CAS”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JAVA中哪些地方用到CAS”吧!

什么是CAS

CAS 全稱compareAndSet,比較并交換的意思,CAS為無鎖操作(其實就是CPU級別的鎖,跟操作系統沒關系,而且CPU級別的鎖比較快)。

顧名思義CAS操作分為兩步,先比較后交換。既然要進行比較然后在進行交換,那肯定是涉及到了三個參數,自己V、和誰進行比較 E、比較完之后需要修改成誰 U。

V即為需要進行比較的參數,E為變量在內存中的最新值,U為需要修改的值。CAS在接收到三個參數后,先對V和E進行比較,如果V=E證明變量V沒有被其他線程修改過,CAS就會把V替換成U;如V != E 證明這個變量已經被其他線程修改了,所以CVS認為本次操作是一次無效操作,不會進行任何操作。

//JDK版本為 jdk1.8.0_161
 public static void main(String[] args) {
        // 1
        AtomicInteger atomicInteger = new AtomicInteger(10);
        // 2
        boolean flag = atomicInteger.compareAndSet(10, 11);
        System.out.println(flag); // true
        // 3
        flag = atomicInteger.compareAndSet(10, 11);
        System.out.println(flag);// false
 }

上面代碼中,第一步是定義了一個原子性的整數類型atomicInteger,它的值為10;第二步對這個value進行CAS操作,因為AtomicInteger對CAS進行了封裝,V永遠是AtomicInteger內部的value,所以第二步的CAS少了V這個參數,CAS拿到atomicInteger變量的value和傳進去的第一個參數進行比較,通過比較發現value = 10 這個條件是成立的,于是就把第二個參數11替換成了原來的10(整個第二步是原子性操作),并且返回一個boolean類型的操作成功true;第三步CAS又拿著自己的value 11(因為在第二步已經替換成為11了)和第一個參數 10 進行比較,通過比較發現11 != 10 條件不成立,于是不進行任何操作,并且返回一個boolean類型的操作失敗 false。

JAVA中哪些地方用到來CAS

目前CAS在jdk中主要應用在J.U.C相關包下的Atomic相關類中,主要有AtomicInteger、AtomicLong、AtomicBoolean、AtomicDouble、AtomicReference、AtomicReferenceFieldUpdater等。

以AtomicInteger類下的getAndUpdate為例 :

/**
  * Atomically updates the current value with the results of
  * applying the given function, returning the previous value. The
  * function should be side-effect-free, since it may be re-applied
  * when attempted updates fail due to contention among threads.
  *
  * @param updateFunction a side-effect-free function
  * @return the previous value
  * @since 1.8
  */
public final int getAndUpdate(IntUnaryOperator updateFunction) {
    int prev, next;
    do {
        prev = get();
        next = updateFunction.applyAsInt(prev);
    } while (!compareAndSet(prev, next));
    return prev;
}

/**
  * Gets the current value.
  *
  * @return the current value
  */
public final int get() {
    return value;
}

第一步:首先通過get()方法獲取到當前對象的value。

第二步:updateFunction為函數引用,不過他的操作也是為了賦值,并返回預期結果。

第三步:進行CAS操作,傳入第一步get()獲取到的值和目前對象中的值進行比較,如果一樣就修改為next,不一樣就繼續循環,直到CAS操作返回true為止。

第四步:返回當前獲取到的值prev。

感謝各位的閱讀,以上就是“JAVA中哪些地方用到CAS”的內容了,經過本文的學習后,相信大家對JAVA中哪些地方用到CAS這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

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

AI

呼和浩特市| 海兴县| 潍坊市| 武汉市| 宜川县| 乃东县| 邵阳市| 五河县| 泾川县| 罗田县| 江安县| 德惠市| 红河县| 顺昌县| 昭平县| 饶阳县| 桦甸市| 巴中市| 通道| 葫芦岛市| 西昌市| 鄂尔多斯市| 于田县| 壶关县| 乌拉特中旗| 南阳市| 辽阳县| 乌兰浩特市| 新民市| 札达县| 金沙县| 烟台市| 商城县| 平定县| 剑阁县| 嵊州市| 盐池县| 蓬莱市| 永福县| 张家口市| 遂宁市|