原子更新数组

1,345 阅读2分钟

文章基于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