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

溫馨提示×

溫馨提示×

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

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

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

澄江县| 吐鲁番市| 双峰县| 二连浩特市| 福鼎市| 黑龙江省| 莎车县| 庆阳市| 高青县| 化德县| 东城区| 江安县| 莲花县| 伊宁市| 花莲市| 长垣县| 龙陵县| 错那县| 萝北县| 邳州市| 石门县| 南昌市| 鄱阳县| 双鸭山市| 福鼎市| 东宁县| 墨江| 武威市| 永兴县| 霍山县| 离岛区| 道孚县| 濮阳县| 伊吾县| 凤山县| 三门县| 牙克石市| 西宁市| 淮安市| 延川县| 武平县|