如何在没有并发修改异常的情况下进行连续循环收集

时间:2018-11-21 06:43:22

标签: java multithreading concurrency concurrentmodification

请仔细阅读文字,标题不是很好,但是我认为没有什么更容易描述问题了。

这是一个理论问题,我将使用Java进行演示,但是我需要的解决方案更像是一种设计模式,因此对于任何一种语言都可以理解。

  

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

如何在没有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();

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

2 个答案:

答案 0 :(得分:2)

您可以使用CopyOnWriteArraySet

例如

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

现在可以从没有ConcurrentModificationException的任何线程访问以上集合。但是它不是实时的,即集合可以更改,并且不会在正在进行的迭代中反映出来。这是线程安全迭代器的缺点

答案 1 :(得分:-1)

无限迭代有什么意义?更改后,可能足以迭代设置了吗?然后,您可以使用观察者模式。