如何在没有并发修改异常的情况下连续循环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<>();
现在无需 ConcurrentModificationException
s 即可从任何线程访问上述集合。但它不是实时的,即集合可以改变,这不会反映在正在进行的迭代中。这是线程安全迭代器的一个缺点
请仔细阅读正文,标题不太好,但我想不出更容易描述问题的内容。
这是一个理论问题,我将使用 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<>();
现在无需 ConcurrentModificationException
s 即可从任何线程访问上述集合。但它不是实时的,即集合可以改变,这不会反映在正在进行的迭代中。这是线程安全迭代器的一个缺点