Atomic介绍
1. Atomic
1.1 Atomic 原子類介紹
Atomic 翻譯成中文是原子的意思。在化學上,我們知道原子是構成一般物質的最小單位,在化學反應中是不可分割的。在我們這里 Atomic 是指一個操作是不可中斷的。即使是在多個線程一起執行的時候,一個操作一旦開始,就不會被其他線程干擾。
所以,所謂原子類說簡單點就是具有原子/原子操作特征的類。
并發包 java.util.concurrent 的原子類都存放在java.util.concurrent.atomic 下,如下圖所示。
根據操作的數據類型,可以將JUC包中的原子類分為4類
基本類型
使用原子的方式更新基本類型
AtomicInteger:整型原子類
AtomicLong:長整型原子類
AtomicBoolean :布爾型原子類
數組類型
使用原子的方式更新數組里的某個元素
AtomicIntegerArray:整型數組原子類
AtomicLongArray:長整型數組原子類
AtomicReferenceArray :引用類型數組原子類
引用類型
AtomicReference: 引 用 類 型 原 子 類
AtomicMarkableReference:原子更新帶有標記的引用類型。該類將 boolean 標記與引用關聯起來
AtomicStampedReference :原子更新帶有版本號的引用類型。該類將整數值與引用關聯起來, 可用于解決原子的更新數據和數據的版本號,可以解決使用 CAS 進行原子更新時可能出現的 ABA 問題。
對象的屬性修改類型
AtomicIntegerFieldUpdater:原子更新整型字段的更新器
AtomicLongFieldUpdater:原子更新長整型字段的更新器
AtomicReferenceFieldUpdater:原子更新引用類型里的字段
修正: AtomicMarkableReference 不能解決ABA問題
CAS ABA 問題
代碼例子(以AtomicInteger 為例)
輸出內容如下:
下面我們來詳細介紹一下這些原子類。
1.2 基本類型原子類
1.2.1 基本類型原子類介紹
使用原子的方式更新基本類型
上面三個類提供的方法幾乎相同,所以我們這里以 AtomicInteger 為例子來介紹。
AtomicInteger 類常用方法
1.2.2 AtomicInteger 常見方法使用
1.2.3?基本數據類型原子類的優勢
通過一個簡單例子帶大家看一下基本數據類型原子類的優勢
①多線程環境不使用原子類保證線程安全(基本數據類型)
②多線程環境使用原子類保證線程安全(基本數據類型)
1.2.4 AtomicInteger 線程安全原理簡單分析
AtomicInteger 類的部分源碼:
AtomicInteger 類主要利用 CAS (compare and swap) + volatile 和 native 方法來保證原子操作,從而避免 synchronized 的高開銷,執行效率大為提升。
CAS的原理是拿期望的值和原本的一個值作比較,如果相同則更新成新的值。UnSafe 類的objectFieldO?set() 方法是一個本地方法,這個方法是用來拿到“原來的值”的內存地址。另外 value 是一個volatile變量,在內存中可見,因此 JVM 可以保證任何時刻任何線程總能拿到該變量的最新值。
1.3 數組類型原子類
1.3.1 數組類型原子類介紹
上面三個類提供的方法幾乎相同,所以我們這里以 AtomicIntegerArray 為例子來介紹。
AtomicIntegerArray 類常用方法
1.3.2 AtomicIntegerArray 常見方法使用
1.4 引用類型原子類
1.4.1 引用類型原子類介紹
上面三個類提供的方法幾乎相同,所以我們這里以 AtomicReference 為例子來介紹。
1.4.2 AtomicReference 類使用示例
上述代碼首先創建了一個 Person 對象,然后把 Person 對象設置進 AtomicReference 對象中,然后調用 compareAndSet 方法,該方法就是通過 CAS 操作設置 ar。如果 ar 的值為 person 的話,則將其設置為 updatePerson。實現原理與 AtomicInteger 類中的 compareAndSet 方法相同。運行上面的代碼后的輸出結果如下:
1.4.3 AtomicStampedReference 類使用示例
輸出結果如下:
1.4.4 AtomicMarkableReference 類使用示例
輸出結果如下:
1.5 對象的屬性修改類型原子類
1.5.1 對象的屬性修改類型原子類介紹
上面三個類提供的方法幾乎相同,所以我們這里以 AtomicIntegerFieldUpdater 為例子來介紹。
1.5.2 AtomicIntegerFieldUpdater 類使用示例
輸出結果:
?
總結
- 上一篇: Android开放root权限
- 下一篇: 视频转码服务