AtomicLongArray
类 (java.util.concurrent.atomic. AtomicLongArray
) 代表着long
数组,在
AtomicLongArray
中的long元素可以原子性的更新,AtomicLongArray
中的long元素同样支持CAS操作。
创建AtomicLongArray
可以用两个构造函数中的一个创建AtomicLongArray
,第一个构造函数需要一个int类型参数,int参数指定了AtomicLongArray
创建的长度,意思就是需要分配多少元素空间,下面是使用这个构造函数创建AtomicLongArray
:
AtomicLongArray array = new AtomicLongArray(10);
这个类作创建了一个容量为10个long的AtomicLongArray
(有 10 个long
元素的空间)。第二个构造函数的参数为 long[]
,用这个构造函数创建AtomicLongArray
,将分配和参数一样大小容量的空间,同时数组中的所有元素都会被拷贝到
AtomicLongArray
,下面是例子:
long[] longs = new long[10];
longs[5] = 123;
AtomicLongArray array = new AtomicLongArray(longs);
上面例子首先创建了一个long数组,然后设置第六个元素的值为123,然后创建AtomicLongArray
,并且上面的long数组作为参数传入。
get()
可以通过get()
方法获取指定元素的值,下面是代码
:
long value = array.get(5);
set()
可以通过set()
方法设置指定元素的值,下面是代码
:
array.set(5, 999);
compareAndSet()
compareAndSet()
方法用于设置指定元素的值,如果当前值与期望值相等则更新为新的值,这个方法是支持CAS操作的,同一个时间只有一个线程调用
compareAndSet()
方法,下面是代码:
boolean swapped = array.compareAndSet(5, 999, 123);
这个例子将索引值为5(第六个)的元素与期望值999比较,如果相等则将索引为5(第六个)的元素值更新为123,compareAndSet()
方法如果更新成功返回true否则返回失败
。
addAndGet()
AtomicLongArray
同时包含了给指定的元素增加值,同时返回新值,addAndGet()和
AtomicLongArray
的其他操作一样都是原子性的,下面是代码:
long newValue = array.addAndGet(5, 3);
执行完代码后,newValue
变量的值将是索引为5(第6个)的元素加上3的值。
getAndAdd()
AtomicLongArray
同时包含了名为getAndAdd()
的方法, getAndAdd()
和 addAndGet()
方法比较相似,唯一不同的是 getAndAdd()
返回增加之前的值,下面是代码:
long oldValue = array.getAndAdd(5, 3);
执行后,oldValue
的值是索引为5(第6个)的加3之前的值。
incrementAndGet()
incrementAndGet()
方法加1后返回新值,下面是代码
:
long newValue = array.incrementAndGet(5);
代码执行后,newValue
变量的值是之前索引为5(第6个)的值加上1
.
getAndIncrement()
AtomicLongArray
类也包含了getAndIncrement()方法,getAndIncrement()
做的事情和incrementAndGet()
一样,唯一不用的是 getAndIncrement()
返回的是增加前的值,下面是代码
:
long oldValue = array.getAndIncrement(5);
执行后,oldValue
还是原来索引为5的值,增加1前的值
。
decrementAndGet()
decrementAndGet()
方法是给定索引对应的元素减1后返回值,下面是代码
:
long newValue = array.decrementAndGet(5);
代码执行后,newValue
变量将返回原索引为5的元素减1
.
getAndDecrement()
AtomicLongArray
也包含getAndDecrement()
方法,
getAndDecrement()
和decrementAndGet()
方法比较类似, 除了getAndDecrement()
返回的是减1之前的值,下面是代码
:
long oldValue = array.getAndDecrement(5);
执行代码后,oldValue
值是原来索引为5减1前的值。
更多的方法
AtomicLongArray
更多的方法可以参考
JavaDoc。
参考:http://tutorials.jenkov.com/java-util-concurrent/atomiclongarray.html
http://tutorials.jenkov.com/java-concurrency/compare-and-swap.html
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/AtomicLongArray.html