今天学习AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray,这几个类的共同特点是都提供数组的原子方式访问和更新功能。下面以AtomicLongArray为代表,对这些类进行介绍。
AtomicLongArray可以用原子方式更新其元素的long数组,实例提供long类型数组的原子方式访问和更新功能。
API
AtomicLongArray(int length)
AtomicLongArray(long[] array)
long addAndGet(int i, long delta)
boolean compareAndSet(int i, long expect, long update)
long decrementAndGet(int i)
long get(int i)
long getAndAdd(int i, long delta)
long getAndDecrement(int i)
long getAndIncrement(int i)
long getAndSet(int i, long newValue)
long incrementAndGet(int i)
void lazySet(int i, long newValue)
int length()
void set(int i, long newValue)
String toString()
boolean weakCompareAndSet(int i, long expect, long update)
long getAndUpdate(int i, LongUnaryOperator updateFunction)
long updateAndGet(int i, LongUnaryOperator updateFunction)
long getAndAccumulate(int i, long x, LongBinaryOperator accumulatorFunction)
long accumulateAndGet(int i, long x, LongBinaryOperator accumulatorFunction)
例1:long型数组的原子访问和更新
import java.util.Arrays;
public class AtomicLongArrayDemo {
public static void main(String[] args) {
for (int i = 0; i <100; i++) {
Thread thread = new Thread() {
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(("[100, 100, 100, 100, 100]").equals(Arrays.toString(Counter.addOne())))
System.out.println("计数器值最终值为[100, 100, 100, 100, 100]");
}
};
thread.start();
}
}
}
class Counter {
private static long[] counter = new long[]{0, 0, 0, 0, 0};
public static long[] addOne() {
for(int i=0;i ++counter[i];
return counter;
}
}
测试程序在连续运行100次将数组所有元素加一的操作后,判断计数器值是否为100, 100, 100, 100, 100],如果为100, 100, 100, 100, 100]就打印计数器值最终值为100, 100, 100, 100, 100]
,否则就什么都不打印。
数次运行程序后,发现大多数结果是什么都没有打印,说明此计数器在多线程环境下不可用。
import java.util.concurrent.atomic.AtomicLongArray;
public class AtomicLongArrayDemo {
public static void main(String[] args) {
for (int i = 0; i <100; i++) {
Thread thread = new Thread() {
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (("[100, 100, 100, 100, 100]").equals(Counter.addOne().toString())) {
System.out.println("计数器值最终值为[100, 100, 100, 100, 100]");
}
}
};
thread.start();
}
}
}
class Counter {
private static AtomicLongArray counter = new AtomicLongArray(new long[] {0, 0, 0, 0, 0});
public static AtomicLongArray addOne() {
for(int i=0;i counter.incrementAndGet(i);
return counter;
}
}
数次运行程序后,发现结果全部为计数器值最终值为[100, 100, 100, 100, 100]
。
实现原理
与AtomicLong相同,AtomicLong也是基于CAS实现的。
AtomicIntegerArray、AtomicReferenceArray与AtomicLongArray很相似,就不多做介绍了。
本文就讲到这里,想了解Java并发编程更多内容请参考:
END.