原子更新陣列

翻身碼農把歌唱發表於2018-10-07

文章基於jdk1.7,通過學習《Java併發程式設計的藝術》,對Java原子操作的理解

通過原子的方式更新陣列中的某個元素,Atomic包提供了以下3個類。

  • AtomicIntegerArray:原子更新整型陣列裡的元素。
  • AtomicLongArray :原子更新長整型陣列裡的元素。
  • AtomicReferenceArray:原子更新引用型別陣列裡的元素。

原子更新陣列

AtomicIntegerArray類常用方法如下:

  • int addAndGet(int i,int delta):以原子方式將輸入值與陣列中索引 i 的元素相加
  • boolean compareAndSet(int i,int expect,int update):如果當前值等於預期值,則以原子方式將陣列位置i的元素設定成update值.

AtomicIntegerArray示例如下:

import java.util.concurrent.atomic.AtomicIntegerArray;

/**
 * @author: xbq
 * @date: 2018/10/7 10:58
 * @description:
 */
public class AtomicIntegerArrayTest {

    static int[] value = new int[] {1, 2};

    static AtomicIntegerArray array = new AtomicIntegerArray(value);

    public static void main(String[] args) {

        System.out.println("---------------getAndSet---------------");

        // 獲取索引為0的值,並且賦值為3
        System.out.println(array.getAndSet(0, 3));
        System.out.println(array.get(0));

        System.out.println("---------------addAndGet---------------");

        // 獲取索引為1的值 並且 加10
        System.out.println(array.addAndGet(1, 10));
        System.out.println(array.get(1));

        System.out.println("-------------compareAndSet-----------------");

        // 獲取索引為1的值,和期望的值比較,若相等,就更新為 新值,否則,返回 false
        System.out.println(array.compareAndSet(1,12,20));
        System.out.println(array.get(1));

        System.out.println("-------------getAndIncrement-----------------");

        // 獲取索引為1的值,並且加1,返回 原值
        System.out.println(array.getAndIncrement(1));
        System.out.println(array.get(1));

        System.out.println("-------------incrementAndGet-----------------");

        // 獲取索引為1的值,並且加1,返回 加1後的值
        System.out.println(array.incrementAndGet(1));
        System.out.println(array.get(1));

        System.out.println("--------------decrementAndGet----------------");

        // 獲取索引為1的值,並且減1,返回減1 後的值
        System.out.println(array.decrementAndGet(1));
        System.out.println(array.get(1));
    }
}
複製程式碼

結果如下:

---------------getAndSet---------------
1
3
---------------addAndGet---------------
12
12
-------------compareAndSet-----------------
true
20
-------------getAndIncrement-----------------
20
21
-------------incrementAndGet-----------------
22
22
--------------decrementAndGet----------------
21
21
複製程式碼

值得注意的是,陣列value通過構造方法傳遞進去,然後AtomicIntegerArray會將當前陣列複製一份,所以當AtomicIntegerArray對內部的陣列元素進行修改時,不會影響傳入的陣列。

歡迎關注我的公眾號~ 搜尋公眾號: 翻身碼農把歌唱 或者 掃描下方二維碼:

img

相關文章