您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(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 操作。
atomic 包中的 13 個(gè)類,屬于 4 種類型的原子更新方式.
(1)原子更新基本類型
(2)原子更新數(shù)組
(3)原子更新引用
(4)原子更新屬性
atomic 包里的類基本都是使用 Unsafe 實(shí)現(xiàn)的包裝類.
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ò),可以把它分享出去讓更多的人看到。
免責(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)容。