中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

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

九龙县| 荔波县| 宁陵县| 托里县| 广西| 积石山| 偏关县| 房产| 宜州市| 柘荣县| 南开区| 桃江县| 柞水县| 武义县| 始兴县| 竹北市| 宜城市| 田林县| 聂荣县| 孝义市| 南昌县| 桂阳县| 汕尾市| 茂名市| 保山市| 黄平县| 云浮市| 新丰县| 伊金霍洛旗| 青浦区| 井陉县| 中阳县| 墨江| 云龙县| 蓝山县| 大庆市| 镇坪县| 东山县| 兰州市| 恩平市| 依安县|