[TOC]
## 基本數據類型原子類
* AtomicBoolen: boolean類型原子類
* AtomicInteger: int類型原子類
* AtomicLong: long類型原子類
常用方法(以AtomicInteger為例)
* addAndGet(int delta) :以原子方式將輸入的數值與實例中原本的值相加,并返回最后的結果;
* incrementAndGet() :以原子的方式將實例中的原值進行加1操作,并返回最終相加后的結果;
* getAndSet(int newValue):將實例中的值更新為新值,并返回舊值;
* getAndIncrement():以原子的方式將實例中的原值加1,返回的是自增前的舊值;
## 數組類型原子類
* AtomicIntegerArray:Int數組類型原子類
* AtomicLongArray:long數組類型原子類
* AtomicReferenceArray:引用類型原子類(關于AtomicReferenceArray即引用類型原子類會在下文介紹)
AtomicIntegerArray為例
~~~
class AtomicDemo {
private int[] value = new int[]{0, 1, 2};
private AtomicIntegerArray mAtomicIntegerArray = new AtomicIntegerArray(value);
private void doAdd() {
for (int i = 0; i < 5; i++) {
int value = mAtomicIntegerArray.addAndGet(0, 1);
System.out.println(Thread.currentThread().getName() + "--->" + value);
}
}
public static void main(String[] args) {
AtomicDemo demo = new AtomicDemo();
new Thread(demo::doAdd, "線程1").start();
new Thread(demo::doAdd, "線程2").start();
}
}
/程序輸出結果如下:
線程1--->1
線程1--->2
線程1--->4
線程2--->3
線程1--->5
線程2--->6
線程1--->7
線程2--->8
線程2--->9
線程2---
~~~
## 引用類型原子類
在Java并發編程之Java CAS操作文章中我們曾經提到過兩個問題
* 第一個問題:雖然我們能通過循環CAS操作來完成對一個變量的原子操作,但是對于多個變量進行操作時,自旋CAS操作就不能保證其原子性。
* 第二個問題:ABA問題,因為CAS在操作值的時候,需要檢查值有沒有發生變化,如果沒有發生變化則更新,但是如果一個值原來是A,變成了B,又變成了A,那么使用CAS進行檢查時會發現她的值并沒有發生變化。那么會導致程序出問題。
為了解決上述提到的兩個問題,Java為我們提供了AtomicReference等系列引用類型原子類,來保證引用對象之間的原子性,即可以把多個變量放在一個對象里來進行CAS操作與ABA問題。主要類型原子類如下:
* AtomicReference:
* AtomicReferenceFieldUpdater:
* AtomicMarkableReference:
* AtomicStampedReference:
ABA問題帶來的隱患,各種樂觀鎖的實現中通常都會用版本戳version來對記錄或對象標記,避免并發操作帶來的問題,在Java中,AtomicStampedReference也實現了這個作用,它通過包裝\[E,Integer\]的元組來對對象標記版本戳stamp,從而避免ABA問題,
## 參考資料
[Java并發編程:原子類Atomic](https://blog.csdn.net/fei20121106/article/details/83268122)
- Java
- Object
- 內部類
- 異常
- 注解
- 反射
- 靜態代理與動態代理
- 泛型
- 繼承
- JVM
- ClassLoader
- String
- 數據結構
- Java集合類
- ArrayList
- LinkedList
- HashSet
- TreeSet
- HashMap
- TreeMap
- HashTable
- 并發集合類
- Collections
- CopyOnWriteArrayList
- ConcurrentHashMap
- Android集合類
- SparseArray
- ArrayMap
- 算法
- 排序
- 常用算法
- LeetCode
- 二叉樹遍歷
- 劍指
- 數據結構、算法和數據操作
- 高質量的代碼
- 解決問題的思路
- 優化時間和空間效率
- 面試中的各項能力
- 算法心得
- 并發
- Thread
- 鎖
- java內存模型
- CAS
- 原子類Atomic
- volatile
- synchronized
- Object.wait-notify
- Lock
- Lock之AQS
- Lock子類
- 鎖小結
- 堵塞隊列
- 生產者消費者模型
- 線程池