java.util.concurrent.atomic.AtomicIntegerArray

jdk1.6类 java.util.concurrent.atomic.AtomicIntegerArray

java.util.concurrent.atomic.AtomicIntegerArray

  1. public AtomicIntegerArray(int length)
  2. _private long rawIndex(int i)_
  3. public AtomicIntegerArray(int length)
  4. public AtomicIntegerArray(int[] array)
  5. public final int length()
  6. public final int get(int i)
  7. public final void set(int i, int newValue)
  8. public final void lazySet(int i, int newValue)
  9. public final int getAndSet(int i, int newValue)
  10. public final boolean compareAndSet(int i, int expect, int update)
  11. public final boolean weakCompareAndSet(int i, int expect, int update)
  12. public final int getAndIncrement(int i)
  13. public final int getAndDecrement(int i)
  14. public final int getAndAdd(int i, int delta)
  15. public final int incrementAndGet(int i)
  16. public final int decrementAndGet(int i)
  17. public final int addAndGet(int i, int delta)
  18. public String toString()

/*
 * %W% %E%
 *
 * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */

package java.util.concurrent.atomic;
import sun.misc.Unsafe;
import java.util.*;

/**
 * An {@code int} array in which elements may be updated atomically.
 * See the {@link java.util.concurrent.atomic} package
 * specification for description of the properties of atomic
 * variables.
 * @since 1.5
 * @author Doug Lea
 */
/**
 * 可以用原子方式更新其元素的 int 数组。有关原子变量属性的描述,
 * 请参阅 java.util.concurrent.atomic 包规范。
 */
public class AtomicIntegerArray implements java.io.Serializable {
    private static final long serialVersionUID = 2862133569453604235L;

   // setup to use Unsafe.compareAndSwapInt for updates
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    private static final int base = unsafe.arrayBaseOffset(int[].class);
    private static final int scale = unsafe.arrayIndexScale(int[].class);
    private final int[] array;

    private long rawIndex(int i) {
        if (i < 0 || i >= array.length)
            throw new IndexOutOfBoundsException("index " + i);
        return base + (long) i * scale;
    }

    /**
     * Creates a new AtomicIntegerArray of given length.
     *
     * @param length the length of the array
     */
    /**
     * 创建给定长度的新 AtomicIntegerArray。
     * @param  length 该数组的长度
     * @return        
     */
    public AtomicIntegerArray(int length) {
        array = new int[length];
        // must perform at least one volatile write to conform to JMM
        if (length > 0)
            unsafe.putIntVolatile(array, rawIndex(0), 0);
    }

    /**
     * Creates a new AtomicIntegerArray with the same length as, and
     * all elements copied from, the given array.
     *
     * @param array the array to copy elements from
     * @throws NullPointerException if array is null
     */
    /**
     * 创建与给定数组具有相同长度的新 AtomicIntegerArray,并从给定数组复制其所有元素。
     * @param  array 从中复制元素的数组
     * @return       [description]
     */
    public AtomicIntegerArray(int[] array) {
        if (array == null)
            throw new NullPointerException();
        int length = array.length;
        this.array = new int[length];
        if (length > 0) {
            int last = length-1;
            for (int i = 0; i < last; ++i)
                this.array[i] = array[i];
            // Do the last write as volatile
            unsafe.putIntVolatile(this.array, rawIndex(last), array[last]);
        }
    }

    /**
     * Returns the length of the array.
     *
     * @return the length of the array
     */
    /**
     * 返回该数组的长度。
     * @return 该数组的长度
     */
    public final int length() {
        return array.length;
    }

    /**
     * Gets the current value at position {@code i}.
     *
     * @param i the index
     * @return the current value
     */
    /**
     * 获取位置 i 的当前值。
     * @param  i 索引
     * @return   当前值
     */
    public final int get(int i) {
        return unsafe.getIntVolatile(array, rawIndex(i));
    }

    /**
     * Sets the element at position {@code i} to the given value.
     *
     * @param i the index
     * @param newValue the new value
     */
    /**
     * 将位置 i 的元素设置为给定值。
     * @param i        索引
     * @param newValue 新值
     */
    public final void set(int i, int newValue) {
        unsafe.putIntVolatile(array, rawIndex(i), newValue);
    }

    /**
     * Eventually sets the element at position {@code i} to the given value.
     *
     * @param i the index
     * @param newValue the new value
     * @since 1.6
     */
    /**
     * 最后将位置 i 的元素设置为给定值。
     * @param i        索引
     * @param newValue 新值
     */
    public final void lazySet(int i, int newValue) {
        unsafe.putOrderedInt(array, rawIndex(i), newValue);
    }

    /**
     * Atomically sets the element at position {@code i} to the given
     * value and returns the old value.
     *
     * @param i the index
     * @param newValue the new value
     * @return the previous value
     */
    /**
     * 将位置 i 的元素以原子方式设置为给定值,并返回旧值。
     * @param  i        索引
     * @param  newValue 薪值
     * @return          以前的值
     */
    public final int getAndSet(int i, int newValue) {
        while (true) {
            int current = get(i);
            if (compareAndSet(i, current, newValue))
                return current;
        }
    }

    /**
     * Atomically sets the element at position {@code i} to the given
     * updated value if the current value {@code ==} the expected value.
     *
     * @param i the index
     * @param expect the expected value
     * @param update the new value
     * @return true if successful. False return indicates that
     * the actual value was not equal to the expected value.
     */
    /**
     * 如果当前值 == 预期值,则以原子方式将位置 i 的元素设置为给定的更新值。
     * @param  i      索引
     * @param  expect 预期值
     * @param  update 薪值
     * @return        如果成功,则返回 true。返回 false 指示实际值与预期值不相等。
     */
    public final boolean compareAndSet(int i, int expect, int update) {
        return unsafe.compareAndSwapInt(array, rawIndex(i),
                                        expect, update);
    }

    /**
     * Atomically sets the element at position {@code i} to the given
     * updated value if the current value {@code ==} the expected value.
     *
     * <p>May <a href="package-summary.html#Spurious">fail spuriously</a>
     * and does not provide ordering guarantees, so is only rarely an
     * appropriate alternative to {@code compareAndSet}.
     *
     * @param i the index
     * @param expect the expected value
     * @param update the new value
     * @return true if successful.
     */
    /**
     * 如果当前值 == 预期值,则以原子方式将位置 i 的元素设置为给定的更新值。
     * 可能意外失败并且不提供排序保证,所以只是在很少的情况下才对 
     * compareAndSet 进行适当地选择。
     * @param  i      索引
     * @param  expect 预期值
     * @param  update 薪值
     * @return        如果成功,则返回 true。
     */
    public final boolean weakCompareAndSet(int i, int expect, int update) {
        return compareAndSet(i, expect, update);
    }

    /**
     * Atomically increments by one the element at index {@code i}.
     *
     * @param i the index
     * @return the previous value
     */
    /**
     * 以原子方式将索引 i 的元素加 1。
     * @param  i 索引
     * @return   以前的值
     */
    public final int getAndIncrement(int i) {
        while (true) {
            int current = get(i);
            int next = current + 1;
            if (compareAndSet(i, current, next))
                return current;
        }
    }

    /**
     * Atomically decrements by one the element at index {@code i}.
     *
     * @param i the index
     * @return the previous value
     */
    /**
     * 以原子方式将索引 i 的元素减 1。
     * @param  i 索引
     * @return   以前的值
     */
    public final int getAndDecrement(int i) {
        while (true) {
            int current = get(i);
            int next = current - 1;
            if (compareAndSet(i, current, next))
                return current;
        }
    }

    /**
     * Atomically adds the given value to the element at index {@code i}.
     *
     * @param i the index
     * @param delta the value to add
     * @return the previous value
     */
    /**
     * 以原子方式将给定值与索引 i 的元素相加。
     * @param  i     索引
     * @param  delta 要加上的值
     * @return       以前的值
     */
    public final int getAndAdd(int i, int delta) {
        while (true) {
            int current = get(i);
            int next = current + delta;
            if (compareAndSet(i, current, next))
                return current;
        }
    }

    /**
     * Atomically increments by one the element at index {@code i}.
     *
     * @param i the index
     * @return the updated value
     */
    /**
     * 以原子方式将索引 i 的元素加 1。
     * @param  i 索引
     * @return   更新的值
     */
    public final int incrementAndGet(int i) {
        while (true) {
            int current = get(i);
            int next = current + 1;
            if (compareAndSet(i, current, next))
                return next;
        }
    }

    /**
     * Atomically decrements by one the element at index {@code i}.
     *
     * @param i the index
     * @return the updated value
     */
    /**
     * 以原子方式将索引 i 的元素减 1。
     * @param  i 索引
     * @return   更新的值
     */
    public final int decrementAndGet(int i) {
        while (true) {
            int current = get(i);
            int next = current - 1;
            if (compareAndSet(i, current, next))
                return next;
        }
    }

    /**
     * Atomically adds the given value to the element at index {@code i}.
     *
     * @param i the index
     * @param delta the value to add
     * @return the updated value
     */
    /**
     * 以原子方式将给定值与索引 i 的元素相加。
     * @param  i     索引
     * @param  delta 要加上的值
     * @return       更新的值
     */
    public final int addAndGet(int i, int delta) {
        while (true) {
            int current = get(i);
            int next = current + delta;
            if (compareAndSet(i, current, next))
                return next;
        }
    }

    /**
     * Returns the String representation of the current values of array.
     * @return the String representation of the current values of array.
     */
    /**
     * 返回数组当前值的字符串表示形式。
     * @return 数组当前值的字符串表示形式。
     */
    public String toString() {
        if (array.length > 0) // force volatile read
            get(0);
        return Arrays.toString(array);
    }

}