Java多线程Day14-JUC原子类之AtomicLongArray

150 阅读3分钟

AtomicLongArray原子类

基本概念

  • AtomicLongArray的作用: 对长整型的数组进行原子操作

AtomicLongArray函数列表

AtomicLongArray

/**
 * 创建一个指定长度的新AtomicLongArray
 * 
 * @param 数组的长度
 */
public AtomicLongArray(int length) {
	array = new long[length];
}

/**
 * 创建和给定的数组长度相同,元素相同的新AtomicLongArray
 * 
 * @param 给定的数组
 */
public AtomicLongArray(long[] array) {
	// Visibility guaranteed by final field guarantees
    this.array = array.clone();
}

addAndGet

/**
 * 以原子的方式将给定值与指定索引位置的值相加并返回相加后的值
 * 
 * @param i 指定的索引位置
 * @param delta 指定的值
 * @return long 相加后的值
 */
public long addAndGet(int i, long delta) {
	return getAndAdd(i, delta) + delta;
}

compareAndSet

/**
 * 如果索引位置的值等于给定的预期值,则将该索引位置的值更新为给定的更新值
 * 
 * @param i 指定的索引位置
 * @param expect 给定的预期值
 * @param update 给定的更新值
 * @return boolean 是否设置成功
 */
public final boolean compareAndSet(int i, long expect, long update) {
	return compareAndSetRaw(checkedByteOffset(i), expect, update);
}

decrementAndGet

/**
 * 以原子方式将索引位置的值减1,返回相减后的值
 * 
 * @param i 指定的索引位置
 * @return long 相减后的值
 */
public final long decrementAndGet(int i) {
	return getAndAdd(i, -1) - 1;
}

get

/**
 * 获取指定索引位置的值
 * 
 * @param i 指定的索引位置
 * @return long 指定索引位置的值
 */
public final long get(int i) {
	return getRaw(checkedByteOffset(i));
}

getAndAdd

/**
 * 以原子的方式将索引位置的值与给定的值相加,返回相加前的值
 * 
 * @param i 指定的索引位置
 * @param delta 给定的值
 * @return long 相加前的值 
 */
public final long getAndAdd(int i, long delta) {
	return unsafe.getAndAddLong(array, checkedByteOffset(i), delta);
}

getAndDecrement

/**
 * 以原子方式将索引位置的值减1,返回相减前的值
 * 
 * @param i 指定的索引位置
 * @return long 相减前的值
 */
public final long getAndDecrement(int i) {
	return getAndAdd(i, -1);
}

getAndIncrement

/**
 * 以原子的方式将索引位置的值加1,返回相加前的值
 * 
 * @param i 指定的索引位置
 * @return long 相加前的值 
 */
public final long getAndIncrement(int i) {
	return getAndAdd(i, 1);
}

getAndSet

/**
 * 以原子的方式将指定所以位置的值设置为给定的值,并返回旧值
 * 
 * @param i 指定的索引位置
 * @param newvalue 给定的值
 * @return long 旧值
 */
public final long getAndSet(int i, long newValue) {
	return unsafe.getAndSetLong(array, checkedByteOffset(i), newValue);
}

incrementAndGet

/**
 * 以原子方式将指定索引位置的值加1,返回相加后的值
 * 
 * @param i 指定的索引位置
 * @return long 相加后的值
 */
public final long incrementAndGet(int i) {
	return getAndAdd(i, 1) + 1;
}

lazySet

/**
 * 懒设置,最终将指定索引位置的值设置为给定的值
 * 
 * @param i 指定的索引位置
 * @param newValue 给定的值
 */
public final void lazySet(int i, long newValue) {
	unsafe.putOrderedLong(array, checkedByteOffset(i), newValue);
}

length

/**
 * 返回AtomicLongArray数组的长度
 * 
 * @return int 数组的长度 
 */
public final int length() {
	return array.length;
}

set

/**
 * 以原子方式将指定索引位置设置为给定的值
 * 
 * @param i 指定的索引位置
 * @param newValue 给定的值
 */
public final void set(int i, long newValue) {
	unsafe.putLongVolatile(array, checkedByteOffset(i), newValue);
}

toString

/**
 * 返回数组的字符串形式
 * 
 * @return String 数组的字符串形式
 */
public String toString() {
        int iMax = array.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(getRaw(byteOffset(i)));
            if (i == iMax)
                return b.append(']').toString();
            b.append(',').append(' ');
        }
    }

weakCompareAndSet

/**
 * 如果指定的索引位置的值等于给定的预期值,则将索引位置的值更新为给定的更新值
 * 
 * @param i 指定的索引位置
 * @param expect 给定的预期值
 * @param update 给定的更新值
 * @return boolean 是否设置成功 
 */
public final boolean weakCompareAndSet(int i, long expect, long update) {
	return compareAndSet(i, expect, update);
}