Concurrent——Atomic原子操作类
轉(zhuǎn)載自https://blog.csdn.net/sdlyjzh/article/details/78587777
打算把Concurrent包下面的一些類整理一下。今天先從最簡單的開始,Atomic原子類。
先看一下atomic包下的類?
?
一共12個(gè),共分四類:基本類型、數(shù)組、引用、屬性。我們就按這四個(gè)分類,介紹一下它們的用途以及實(shí)現(xiàn)。
基本類型
包含上圖紅框里面的三個(gè)類。由于三個(gè)類提供的方法基本一致,下面以AtomicInterger為例。?
AtomicInteger的常用方法如下:?
?
實(shí)現(xiàn)邏輯都差不多,取當(dāng)前值current,然后計(jì)算更改后的值。利用CAS思想,比較current和當(dāng)前數(shù)值是否相等,如果相等,則更新,如果不相等,則重復(fù)上述操作。下面借助源碼分析:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
可以看出,通過compareAndSet方法,保證原子操作。
public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update);}- 1
- 2
- 3
調(diào)用Unsafe類的compareAndSwapInt方法。Unsafe類中方法為native方法,具體未看,原理就是利用CAS。
java有8個(gè)基本類型,而這里只有3個(gè),那么其他5個(gè)如果也想原子操作呢?其實(shí)可以參考AtomicBoolean的實(shí)現(xiàn),它先將boolean類型值轉(zhuǎn)換成int。
數(shù)組
原子數(shù)組類型參見圖中綠色框中的3個(gè)類。其底層實(shí)現(xiàn)邏輯和原子基本類型一致,這里我們看看如何使用數(shù)組類型。
static int[] value = new int[]{1,2};static AtomicIntegerArray ai = new AtomicIntegerArray(value);public static void main(String[] args){ai.getAndSet(0, 3);System.out.println(value[0]);System.out.println(ai.get(0));}思考一下輸出,再看結(jié)果:
1 3是不是和你預(yù)想的不一樣?傳遞的數(shù)組,為什么沒有更改原始數(shù)組呢?AtomicIntegerArray會(huì)復(fù)制傳遞過來的數(shù)組,所以,AtomicIntegerArray修改內(nèi)部數(shù)組元素時(shí),不會(huì)影響傳入的數(shù)組。
原子引用類型
3個(gè)原子引用類型,參加圖中黃色框中的類。
- AtomicReference:原子引用類型
- AtomicStampedReference:原子帶有版本號(hào)的引用類型
- AtomicMarkableReference:原子帶有標(biāo)記位的引用類型
原子字段類
參見上圖未框住的3個(gè)類。?
需要注意的是,因?yàn)樵幼侄晤悶槌橄箢?#xff0c;每次使用時(shí),通過靜態(tài)方法newUpdater()創(chuàng)建一個(gè)更新器,并且設(shè)置需要更新的類和屬性。同時(shí),更新類的字段必須用volatile修飾。
參考:《Java并發(fā)編程的藝術(shù)》
超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生總結(jié)
以上是生活随笔為你收集整理的Concurrent——Atomic原子操作类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中的Atomic包使用指南
- 下一篇: GC算法基础