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