《java併發程式設計的藝術》原子操作類

sayWhat_sayHello發表於2018-07-18

java.util.concurrent.atomic包,4種原子更新方式:原子更新基本資料,原子更新陣列,原子更新引用,原子更新屬性。

原子更新基本型別

包含3個類:AtomicBoolean,AtomicInteger,AtomicLong

AtomicInteger為例,常用方法有:
- int addAndGet(int delta) 以原子方式相加並返回結果
- boolean compareAndSet(int expect,int update)如果輸入的數值等於預期值,則以原子方式將該值設定為輸入的值
- int getAndIncrement()以原子方式將當前值加1,返回自增前的值
- void lazySet(int newValue)將值設定為newValue,但是需要一些時間。
- int getAndSet(int newValue)以原子方式設定為newValue,返回舊值

        AtomicInteger a = new AtomicInteger(5);
        System.out.println(a.getAndIncrement()); //輸出5  值為6
        System.out.println(a.getAndIncrement()); //輸出6  值為7
        System.out.println(a.compareAndSet(7, 9)); //此時值為7,所以值會變更為9並返回true。否則返回false,值不變。

原子更新陣列

包含4個類:AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray,AtomicIntegerArray,AtomicDoubleArray

常用方法:
- int addAndGet(int i,int delta)以原子方式將索引為i的和delta相加。
- boolean compareAndSet(int i,int expect,int update)獲取索引i的值compareAndSet

        int[] b = new int[]{1, 2};
        AtomicIntegerArray array = new AtomicIntegerArray(b);
        System.out.println(array.addAndGet(0, 5));//array索引為0的值更新為6

原子更新引用型別

包含3個類:AtomicReference,AtomicReferenceFieldUpdater,AtomicMarkableReference

        User user = new User("www",20);
        User user1 = new User("ww", 5);
        AtomicReference<User> reference = new AtomicReference<>();
        reference.set(user);
        reference.compareAndSet(user, user1);
        System.out.println(reference.get().getName()); //[5, 6]

原子更新欄位類

原子更新某個類裡的某個欄位:AtomicIntegerFieldUpdater,AtomicLongFieldUpdater,AtomicStampedReference
要想原子的更新欄位有兩步:
1.使用靜態方法newUpdater建立一個更新器,並且設定欲更新的類和屬性
2.更新類的欄位必須使用public volatile修飾符

        AtomicIntegerFieldUpdater<User> atomicIntegerFieldUpdater = AtomicIntegerFieldUpdater.newUpdater(User.class, "age");
        //User有一個欄位為age,相當於操作該欄位

相關文章