如何在没有并发修改异常的情况下连续循环collection

how to Continous loop collection without concurrentmodificationexception

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

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

A program has 2 threads:
thread A - interacts with user, who can add or remove items to a set
thread B - continously iterate over a Set performing tasks over its items

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

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

你可以使用 CopyOnWriteArraySet

例如

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

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