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

溫馨提示×

溫馨提示×

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

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

Java中怎么實現原子操作類

發布時間:2021-07-15 11:07:56 來源:億速云 閱讀:192 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關Java中怎么實現原子操作類,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

 

一、引言

在 JDK1.5 中新增 java.util.concurrent(J.U.C) 包,它建立在 CAS 之上。CAS 是非阻塞算法的一種常見實現,相對于 synchronized 這種阻塞算法,它的性能更好。

DK1.5 中引入了底層的支持,在 int、long 和對象的引用等類型上都公開了 CAS 的操作,并且 JVM 把它們編譯為底層硬件提供的最有效的方法,在運行 CAS 的平臺上,運行時把它們編譯為相應的機器指令。在 java.util.concurrent.atomic 包下面的所有的原子變量類型中,比如 AtomicInteger,都使用了這些底層的JVM支持為數字類型的引用類型提供一種高效的 CAS 操作。


二、Java原子類介紹

atomic 包中的 13 個類,屬于 4 種類型的原子更新方式.

  • (1)原子更新基本類型

  • (2)原子更新數組

  • (3)原子更新引用

  • (4)原子更新屬性

atomic 包里的類基本都是使用 Unsafe 實現的包裝類.

 

1.原子更新基本類型

  • AtomicBoolean:原子更新布爾類型。

  • AtomicInteger:原子更新整型。

  • AtomicLong:原子更新長整型。

本類以 AtomicInteger 進行講解:

AtomicInteger 是一個支持原子操作的 Integer 類,就是保證對 AtomicInteger 類型變量的增加和減少操作是原子性的,不會出現多個線程下的數據不一致問題。如果不使用 AtomicInteger,要實現一個按順序獲取的 ID,就必須在每次獲取時進行加鎖操作,以避免出現并發時獲取到同樣的 ID 的現象。

  • int addAndGet(int delta) 以原子方式將輸入的數值與實例中的值相加,并返回結果;

  • boolean compareAndSet(int expect, int update) 如果輸入的數值等于預期值,則以原子的方式將該值設置為輸入的值;

  • int getAndIncrement() 以原子方式將當前值加 1,注意,這里返回的是自增前的值;

  • void lazySet(int newValue) 最終會設置成 newValue,使用 lazySet 設置值后,可能導致其他線程在之后的一小段時間內還是可以讀到 舊值;

  • int getAndSet(int newValue) 以原子方式設置為 newValue 的值,并返回舊值。

那么getAndIncrement 是如何實現原子操作的呢?

1public final int getAndIncrement() { 
2    for (;;) { 
3        int current = get(); 
4        int next = current + 1; 
5        if (compareAndSet(current, next)) 
6            return current; 
7    } 
8}

關于Java中怎么實現原子操作類就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

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

AI

海城市| 虞城县| 新营市| 莱州市| 当阳市| 聂拉木县| 富源县| 老河口市| 新泰市| 高平市| 凭祥市| 庆元县| 扶风县| 始兴县| 广灵县| 上林县| 连山| 恩平市| 青龙| 庄河市| 太仓市| 汕尾市| 盈江县| 阿图什市| 明水县| 乃东县| 日喀则市| 明星| 依兰县| 北票市| 基隆市| 商南县| 海城市| 定日县| 漯河市| 九江县| 沾化县| 门头沟区| 迁安市| 阿勒泰市| 全南县|