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

溫馨提示×

溫馨提示×

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

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

CAS原理與JDK8的優化是什么

發布時間:2021-10-22 08:18:55 來源:億速云 閱讀:157 作者:柒染 欄目:大數據

CAS原理與JDK8的優化是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

什么是CAS

CAS-CompareAndSet,是JDK原子變量類AtomicInteger、AtomicLong、AtomicInteger、AtomicBoolean、AtomicReference等實現的基礎,例如對于一個共享變量int,就算是簡單的自增操作也不是原子性的,多線程同時自增,可能會導致變量的值比預期結果小。但是可以使用AtomicInteger的incrementAndGet() 方法操作變量,這樣結果和預期值一樣。跟傳統的加鎖不同,getAndDecrement()方法并沒有給代碼加鎖。代碼類似于:

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

底層通過sun.misc.Unsafe的本地方法compareAndSwapInt實現,這個方法是原子的。

與synchronized的對比

  • 樂觀鎖與悲觀鎖的區別

  • 性能對比

synchronized是阻塞的,CAS更新是非阻塞的,只是會重試,不會有線程上下文切換開銷,對于大部分比較簡單的操作,無論是在低并發還是高并發情況下,這種樂觀非阻塞方式的性能都要遠高于悲觀阻塞式方式。

應用場景

  • 用來實現樂觀非阻塞算法,確保當前線程方法體內使用的共享變量不被其他線程改變,CAS廣泛運用在非阻塞容器中。

  • 用來實現悲觀阻塞式算法,其用在了顯式鎖的原理實現,如可重入計數中,調用lock()方法時將通過CAS方法將其設為1,調用unlock則設為遞減1。如果同時多個線程調用Lock方法那么必然會導致原子修改不成功,保證了鎖的機制,排他性。

可能存在的問題

  • ABA問題,普通的CAS操作并不是原子的,因為有可能另一個線程改了值但是又改回了值,那么樂觀鎖的方式是不能保證原子性的,若業務需要規避這種情況那么可以使用AtomicStampedReference的compareAndSet(V expectedReference, V newReference, int expectedStamp, int newStamp)方法,只有值和時間戳都相等的時候才進行原子更新,每次更新都把當前時間修改進原子變量。

JDK8的優化

JAVA8新增了LongAdder、DoubleAdder對原子變量進行進一步優化,主要是利用了分段CAS的機制,如果不用LongAdder,用AtomicLong的話,在高并發情況下,會產生一直自旋,導致效率不高。他將一個數分成若干個數,CompareAndSet方法的參數只是比較的這若干個數中的一個數,從而降低了自旋的概率,提高了效率。

關于CAS原理與JDK8的優化是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

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

AI

胶州市| 鲁甸县| 泸溪县| 金寨县| 朝阳区| 达拉特旗| 北海市| 那曲县| 佛学| 亚东县| 正安县| 改则县| 新津县| 龙门县| 那曲县| 蓝山县| 锡林郭勒盟| 瑞安市| 渭南市| 邹平县| 墨竹工卡县| 宝丰县| 武隆县| 绥江县| 道真| 连南| 屯留县| 嘉善县| 阿勒泰市| 花莲县| 称多县| 依兰县| 清徐县| 兴海县| 雷波县| 吉安县| 环江| 泰宁县| 玉树县| 建始县| 高阳县|