请仔细阅读文字,标题不是很好,但是我认为没有什么更容易描述问题了。
这是一个理论问题,我将使用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();
这是一个非常普通的场景,应该有一种设计模式来处理
答案 0 :(得分:2)
您可以使用CopyOnWriteArraySet
例如
Set<Integer> threadSafeSet = new CopyOnWriteArraySet<>();
现在可以从没有ConcurrentModificationException
的任何线程访问以上集合。但是它不是实时的,即集合可以更改,并且不会在正在进行的迭代中反映出来。这是线程安全迭代器的缺点
答案 1 :(得分:-1)
无限迭代有什么意义?更改后,可能足以迭代设置了吗?然后,您可以使用观察者模式。