溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java中怎么實(shí)現(xiàn)原子操作類

發(fā)布時(shí)間:2021-07-15 11:07:56 來(lái)源:億速云 閱讀:191 作者:Leah 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)Java中怎么實(shí)現(xiàn)原子操作類,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

 

一、引言

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

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


二、Java原子類介紹

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

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

  • (2)原子更新數(shù)組

  • (3)原子更新引用

  • (4)原子更新屬性

atomic 包里的類基本都是使用 Unsafe 實(shí)現(xiàn)的包裝類.

 

1.原子更新基本類型

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

  • AtomicInteger:原子更新整型。

  • AtomicLong:原子更新長(zhǎng)整型。

本類以 AtomicInteger 進(jìn)行講解:

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

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

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

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

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

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

那么getAndIncrement 是如何實(shí)現(xiàn)原子操作的呢?

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}

關(guān)于Java中怎么實(shí)現(xiàn)原子操作類就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI