首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CopyOnWriteArrayList删除逻辑

CopyOnWriteArrayList删除逻辑
EN

Stack Overflow用户
提问于 2015-11-22 21:13:52
回答 1查看 223关注 0票数 0

在我想要运行的每个线程中,这类代码初始化列表

代码语言:javascript
复制
 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;

创建用于删除的线程

代码语言:javascript
复制
 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的读写问题。如何避免这种情况?

EN

回答 1

Stack Overflow用户

发布于 2015-11-22 21:29:43

如果您只想确保删除操作成功,那么请按列表同步代码,如下所示:

代码语言:javascript
复制
public void run() {
    for (int j = 0; j < threadElemAmount; j++) {
        synchronized (list) {
            list.remove((int) (list.size() - 1));
        }
    }
}

同时,您也可以放心地使用相同的列表实例进行同步。

这个问题是由下面这行代码引起的:

代码语言:javascript
复制
list.remove((int) (list.size() - 1));

是这样处理的:

代码语言:javascript
复制
1: int tempVal = list.size() - 1;
2: list.remove(tempVal);

在您的示例中,线程A正在执行第1行,将执行上下文传递给线程B,线程B执行1和2,然后线程A抛出异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33855156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档