09.10 Java語言中提供的12個原子操作類

Java語言中提供的12個原子操作類

如果程序在多線程的情況下,不考慮線程安全,那麼多線程同時操作一個變量時,可能得到期望之外的值。這是因為多線程在沒有考慮線程安全的情況下,主內存與工作內存之間的變量值賦值的時候各自操作各自的,導致最終結果不一致,稱為線程不安全的操作。通常我們會使用synchronized來解決這個問題,synchronized會保證多線程不會同時更新變量,但是這樣在高併發的情況下,效率特別低下。而Java從JDK 1.5開始提供了java.util.concurrent.atomic包(以下簡稱Atomic包),這個包中的原子操作類提供了一種用法簡單、性能高效、線程安全地更新一個變量的方式。

Java語言中提供的12個原子操作類


在Atomic包裡提供的12個類,屬於4種類型的原子更新方式,分別是原子更新基本類型、原子更新數組、原子更新引用和原子更新字段(屬性)。Atomic包裡的類基本都是使用Unsafe實現的包裝類。

一、原子更新基本類型類

使用原子的方式更新基本類型,Atomic提供了以下三種類:

1、AtomicBoolean:原子更新布爾類型

2、AtomicInteger:原子更新整型

3、AtomicLong:原子更新長整型

AtomicInteger中的部分代碼,可以看出是通過Unsafe來實現的。

Java語言中提供的12個原子操作類


AtomicBoolean中部分代碼如下:

Java語言中提供的12個原子操作類


可以看出它是先把Boolean轉換成整型,再使用compareAndSwapInt進行CAS,所以原子更新char、float和double變量也可以用類似的思路來實現。

二、原子更新數組

通過原子的方式更新數組裡的某個元素,Atomic包裡提供了以下三種類:

1、AtomicIntegerArray:原子更新整型數組裡的元素。

2、AtomicLongArray:原子更新長整型數組裡的元素。

3、AtomicReferenceArray:原子更新引用類型數組裡的元素。

以下是AtomicIntegerArray類中部分代碼:

Java語言中提供的12個原子操作類

Java語言中提供的12個原子操作類


通過上圖中可以看出,數組通過構造方法傳遞進去,然後AtomicIntegerArray會將當前數組複製一份,所以當AtomicIntegerArray對內部的數組元素進行修改時,不會影響傳入的數組。

三、原子更新引用類型

原子更新基本類型的AtomicInteger,只能更新一個變量,如果要原子更新多個變量,就需要使用這個原子更新引用類型提供的類。Atomic包提供了以下三個類:

1、AtomicReference:原子更新引用類型。

2、AtomicReferenceFieldUpdater:原子更新引用類型裡的字段。

3、AtomicMarkableReference:原子更新帶有標記位的引用類型。可以原子更新一個布爾類型的標記位和引用類型。構造方法是AtomicMarkableReference(V initialRef,boolean initialMark)。

AtomicReference中部分代碼如下:

Java語言中提供的12個原子操作類

Java語言中提供的12個原子操作類


代碼中首先構建一個引用對象,然後把引用對象設置進AtomicReferenc中,最後調用compareAndSet方法進行原子更新操作,實現原理同AtomicInteger裡的compareAndSet方法。

四、原子更新字段類

如果需原子地更新某個類裡的某個字段時,就需要使用原子更新字段類,Atomic包提供了以下3個類進行原子字段更新:

1、AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。

2、AtomicLongFieldUpdater:原子更新長整型字段的更新器。

3、AtomicStampedReference:原子更新帶有版本號的引用類型。該類將整數值與引用關聯起來,可用於原子的更新數據和數據的版本號,可以解決使用CAS進行原子更新時可能出現的ABA問題。

以AtomicIntegerFieldUpdater為例,先看一下它的代碼:

Java語言中提供的12個原子操作類


要想原子地更新字段類需要兩步。第一步,因為原子更新字段類都是抽象類,每次使用的時候必須使用靜態方法newUpdater()創建一個更新器,並且需要設置想要更新的類和屬性。第二步,更新類的字段(屬性)必須使用public volatile修飾符。

熟練掌握並運用這些原子操作類,可以極大的提高併發編程的效率和減少併發加鎖帶來的性能開銷。


分享到:


相關文章: