首页 > 解决方案 > 如何在没有并发修改异常的情况下进行连续循环收集

问题描述

请仔细阅读文字,标题不太好,但我想不出更容易描述问题的东西。

这是一个理论问题,我将使用 java 来演示,但我需要的解决方案更像是一种设计模式,因此它可能是任何语言的思想。

一个程序有 2 个线程:
线程 A - 与用户交互,用户可以向集合中添加或删除项目
线程 B - 不断迭代集合,对其项目执行任务

我怎么能在没有的情况下执行这个场景ConcurrentModificationException

final Set<String> set = new HashSet();

//A
new Thread(new Runnable(){
public void run(){
while(true){

//user adds or remove items to set

}
}
}).start();


new Thread(new Runnable(){
public void run(){
while(true){

for(String s : set){
//do stuff
}

}
}
}).start();

这是一个非常常见的场景,应该有一个设计模式来处理它

标签: javamultithreadingconcurrencyconcurrentmodification

解决方案


你可以使用CopyOnWriteArraySet

例如

Set<Integer> threadSafeSet = new CopyOnWriteArraySet<>();

现在可以从没有ConcurrentModificationExceptions 的任何线程访问上述集合。但它不是实时的,即集合可以改变,这不会反映在正在进行的迭代中。这是线程安全迭代器的一个缺点


推荐阅读