JUC原子类3-AtomicLongArray原子类
概要:
AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray这三个数组类型的原子类的原理和用法相似。本文章以AtomicLongArray对数组类型的原子类进行介绍。
AtomicLongArray介绍和函数列表
AtomicLongArray的作用是对“长整型数组”进行原子操作。
函数列表:
// 创建给定长度的新 AtomicLongArray。 AtomicLongArray(int length) // 创建与给定数组具有相同长度的新 AtomicLongArray,并从给定数组复制其所有元素。 AtomicLongArray(long[] array) // 以原子方式将给定值添加到索引 i 的元素。 long addAndGet(int i, long delta) // 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 boolean compareAndSet(int i, long expect, long update) // 以原子方式将索引 i 的元素减1。 long decrementAndGet(int i) // 获取位置 i 的当前值。 long get(int i) // 以原子方式将给定值与索引 i 的元素相加。 long getAndAdd(int i, long delta) // 以原子方式将索引 i 的元素减 1。 long getAndDecrement(int i) // 以原子方式将索引 i 的元素加 1。 long getAndIncrement(int i) // 以原子方式将位置 i 的元素设置为给定值,并返回旧值。 long getAndSet(int i, long newValue) // 以原子方式将索引 i 的元素加1。 long incrementAndGet(int i) // 最终将位置 i 的元素设置为给定值。 void lazySet(int i, long newValue) // 返回该数组的长度。 int length() // 将位置 i 的元素设置为给定值。 void set(int i, long newValue) // 返回数组当前值的字符串表示形式。 String toString() // 如果当前值 == 预期值,则以原子方式将该值设置为给定的更新值。 boolean weakCompareAndSet(int i, long expect, long update)
incrementAndGet()的源码如下:
public final long incrementAndGet(int i) { return addAndGet(i, 1); }
说明:作用是以原子方式将long数组的索引i的元素加一,并返回加一之后的值
addAndGet()的源码如下:
public long addAndGet(int i, long delta) { // 检查数组是否越界 long offset = checkedByteOffset(i); while (true) { // 获取long型数组的索引 offset 的原始值 long current = getRaw(offset); // 修改long型值 long next = current + delta; // 通过CAS更新long型数组的索引 offset的值。 if (compareAndSetRaw(offset, current, next)) return next; } }
说明:addAndGet()首先检查数组是否越界。如果没有越界的话,则先获取数组索引i的值;然后通过CAS函数更新i的值
getRaw()的源码如下:
private long getRaw(long offset) { return unsafe.getLongVolatile(array, offset); }
说明:unsafe是通过unsafe.getUnsafe()返回的一个Unsafe对象。通过Unsafe的CAS函数对long数组的元素进行原子操作。如compareAndSetRaw()就是调用Unsafe的CAS函数,它的源码如下:
private boolean compareAndSetRaw(long offset, long expect, long update) { return unsafe.compareAndSwapLong(array, offset, expect, update); }