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

溫馨提示×

溫馨提示×

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

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

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

盐城市| 延川县| 高碑店市| 如皋市| 延吉市| 诸暨市| 乌兰察布市| 东宁县| 浦江县| 叙永县| 右玉县| 商丘市| 三江| 灵璧县| 丽江市| 曲沃县| 东明县| 陆河县| 乐至县| 会东县| 雅江县| 凌云县| 江口县| 佛坪县| 万盛区| 鹿邑县| 土默特右旗| 巩留县| 民勤县| 青神县| 灵川县| 化州市| 南陵县| 定襄县| 雅江县| 启东市| 壤塘县| 临猗县| 泉州市| 兴义市| 淳化县|