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

溫馨提示×

溫馨提示×

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

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

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

阿鲁科尔沁旗| 朔州市| 临海市| 香河县| 迭部县| 阿克苏市| 合江县| 丹江口市| 滁州市| 手机| 平阴县| 宁河县| 海宁市| 盐山县| 韶关市| 兴城市| 资兴市| 祥云县| 阿拉善盟| 文成县| 双桥区| 晋宁县| 离岛区| 莒南县| 新巴尔虎右旗| 通城县| 浪卡子县| 宝鸡市| 汕尾市| 闵行区| 永宁县| 阳春市| 张家口市| 全南县| 巨鹿县| 兴义市| 江津市| 新巴尔虎右旗| 泾阳县| 永春县| 陆河县|