Java併發編程的藝術讀書筆記(第七章)

第六章-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問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章