1. 程式人生 > >併發包原子類的簡單使用

併發包原子類的簡單使用

package ThreadLearn;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerArray;

public class T015_1 {
   //jdk1.5開始提供原子類包 Atomic包裡一共you 13個原子類
	static AtomicInteger ai= new AtomicInteger(1);
	
	
	//原子更新陣列
			//AutomicIntegerArray,AutomicLongArray,AutomicReferenceArray
			//AutomicIntegerArray常用方法,int addAndGet(int i,int delta)  boolean compareAndSet(int i,int except,int update)
			static int [] value =new int[]{1,2};
			static AtomicIntegerArray aiArray=new AtomicIntegerArray(value);
	
	public static void  main(String [] args) {
		
		System.out.println(ai.addAndGet(5));
		//以原子的方式將當前值加1,這是返回之前的值
		System.out.println(ai.getAndIncrement());
		System.out.println(ai.get());
		//以原子方式設定為newvalue的值,並返回舊值
		System.out.println(ai.getAndSet(8));
		System.out.println(ai.get());
		//看了automicBoolean原始碼,就是把Boolean轉換為整形,再用compareAndSwapInt進行CAS,原子類其他更新也是如此
		
		
		aiArray.getAndSet(0, 3);
		System.out.println(aiArray.get(0));//快速安全的,相當於複製了一份
		
		
		
		
	}
}

原子更新欄位類
•AtomicIntegerFieldUpdater:原子更新整型的欄位的更新器。
•AtomicLongFieldUpdater:原子更新長整型欄位的更新器。

•AtomicStampedReference:原子更新帶有版本號的引用型別。該類將整數值與引用關聯起來,可用於原子的更新資料和資料的版本號,可以解決使用CAS進行原子更新時可能出現的ABA問題。
第一步,因為原子更新欄位類都是抽象類,每次使用的時候必須使用靜態方法AtomicIntegerFieldUpdater.newUpdater建立一個更新器,並且需要設定想要更新的類和屬性。第二步,更新類的欄位(屬性)必須使用public volatile修飾符(private volatile int old)