第六章-Java中的13個原子操作類
原子更新基本類型類
- AtomicBoolean 原子更新布爾類型
- AtomicInteger 原子更新整型
- AtomicLong 原子更新長整型
上述3類提供方法基本一致,以AtomicInteger爲例
- int addAndGet(int delta)
- 以原子方式與 delta 相加
- boolean compareAndSet(int expect,int update)
- 如果輸入的數值等於 expect 則以原子方式將值設置爲 update
- int getAndIncrement()
- 以原子方式自增,返回值爲增加之前的值
- void lazySet(int newValue)
- 使用次方法會延遲值的設置,一段時間內其他線程可能讀到舊值
- int getAndSet(int newValue)
以原子方式將值設置爲 newValue
源碼很簡單,循環調用unsafe裏提供到方法
public final int getAndIncrement(){
for(;;){
int current = get();
int next = current + 1;
//注意返回的是舊值
if(compareAndSet(current,next))
return current;
}
}
public final boolean compareAndSet(int expect, int update){
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
Atomic 包裏的類基本都是使用Unsafe實現的,Unsafe 一共提供了3個CAS方法
public final native boolean compareAndSwapObject(Object o,
long offset, Object expected, Object x);
public final native boolean compareAndSwapInt(Object o,
long offset, Object expected, int x);
public final native boolean compareAndSwapLong(Object o,
long offset, Object expected, long x);
在看AtomicBoolean源碼,發現它是先把Boolean轉化成整型,在使用compareAndSwapInt進行CAS,所以更新 char ,float ,double也可以用類似的思路。
原子更新數組
與上面同樣道理
- AtomicLongArray 原子更新長整型數組
- AtomicReferenceArray 原子更新引用類型數組
- AtomicIntegerArray 原子更新整型數組
原子更新引用類型
- AtomicReference 原子更新引用類型
- AtomicReferenceFieldUpdater 原子更新引用類型裏的字段
- AtomicMarkableReference 原子更新帶有標記位的引用類型
原子更新字段類
- AtomicIntegerFieldUpdater 原子更新整型的字段
- AtomicLongFieldUpdater 原子更新長整型字段
- AtomicStampedReference 原子更新帶有版本號的引用類型
- 可以解決使用CAS進行原子更新時可能出現的ABA問題