文章基于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对内部的数组元素进行修改时,不会影响传入的数组。
欢迎关注我的公众号~ 搜索公众号: 翻身码农把歌唱 或者 扫描下方二维码: