原子更新数组

文章基于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示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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));
}
}

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
---------------getAndSet---------------
1
3
---------------addAndGet---------------
12
12
-------------compareAndSet-----------------
true
20
-------------getAndIncrement-----------------
20
21
-------------incrementAndGet-----------------
22
22
--------------decrementAndGet----------------
21
21

值得注意的是,数组value通过构造方法传递进去,然后AtomicIntegerArray会将当前数组复制一份,所以当AtomicIntegerArray对内部的数组元素进行修改时,不会影响传入的数组。

欢迎关注我的公众号~ 搜索公众号: 翻身码农把歌唱 或者 扫描下方二维码:

img

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------
分享到:
0%