原子相关的数组

原子相关的数组

在java.util.concurrent.atomic包下提供了一些原子操作的数组

  • AtomicIntegerArray
  • AtomicLongArray
  • AtomicReferenceArray

通过多线程将数组中每个位置元素值自增1000次,在不使用原子数组的时候出现了问题。

public static int[] array = new int[10];

public static void main(String[] args) throws InterruptedException {
    Runnable r = ()->{
        for (int i = 0; i < 1000; i++) {
            for (int j = 0; j < array.length; j++) {
                ++array[j];
            }
        }
    };

    ExecutorService es = Executors.newFixedThreadPool(10);
    //将任务放入到线程池中
    for (int i = 0; i < 10; i++) {
        es.submit(r);
    }

    //关闭线程池
    es.shutdown();
    //等待线程池中的任务全部结束
    while (!es.isTerminated()){}

    System.out.println(Arrays.toString(array));

下面使用原子数组解决线程安全问题。

//原子数组
public static AtomicIntegerArray array = new AtomicIntegerArray(10);

public static void main(String[] args) throws InterruptedException {
    Runnable r = ()->{
        for (int i = 0; i < 1000; i++) {
            for (int j = 0; j < array.length(); j++) {
                //指定下标的元素自增
                array.getAndIncrement(j);
            }
        }
    };

    ExecutorService es = Executors.newFixedThreadPool(10);
    //将任务放入到线程池中
    for (int i = 0; i < 10; i++) {
        es.submit(r);
    }

    //关闭线程池
    es.shutdown();
    //等待线程池中的任务全部结束
    while (!es.isTerminated()){}

    System.out.println(array);