併發包原子類的簡單使用
阿新 • • 發佈:2018-11-29
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)