CopyOnWriteArrayList删除逻辑

时间:2015-11-22 13:13:52

标签: java multithreading arraylist thread-safety

在每个线程中我想运行这种代码 初始化列表

 final int initialSize = 2000;
        final Random rand = new Random(System.currentTimeMillis());
        Thread creationThread = new Thread(new Runnable() {
            @Override
            public void run() {
                for (int j = 0; j < initialSize; j++) {
                    list.add(rand.nextInt(10000));
                }
            }
        });
        creationThread.start();
        creationThread.join();
        List<Thread> threads = new ArrayList<Thread>();
        final int threadElemAmount = initialSize / numberOfThreads;

创建用于删除的线程

 for (int i = 0; i < numberOfThreads; i++) {
        threads.add(new Thread(new Runnable() {
            @Override
            public void run() {
                for (int j = 0; j < threadElemAmount; j++) {
                        list.remove((int) (list.size() - 1));
                }
            }
        }));
    }

但是我遇到ArrayIndexOutOfBoundsException读写问题。怎么避免这个?

1 个答案:

答案 0 :(得分:0)

如果您只想确保删除操作成功,请按列表同步您的代码,例如:

public void run() {
    for (int j = 0; j < threadElemAmount; j++) {
        synchronized (list) {
            list.remove((int) (list.size() - 1));
        }
    }
}

还要确保您正在使用相同的列表实例进行同步。

问题是由以下事实引起的:

list.remove((int) (list.size() - 1));

像这样处理:

1: int tempVal = list.size() - 1;
2: list.remove(tempVal);

在你的情况下,线程A执行第1行,产生执行上下文到线程B,执行1和2,然后线程A抛出异常。