【问题标题】:how to Continous loop collection without concurrentmodificationexception如何在没有并发修改异常的情况下连续循环收集
【发布时间】:2018-11-21 06:43:22
【问题描述】:

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

这是一个理论问题,我将使用 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();

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

【问题讨论】:

标签: java multithreading concurrency concurrentmodification


【解决方案1】:

你可以使用CopyOnWriteArraySet

例如

Set&lt;Integer&gt; threadSafeSet = new CopyOnWriteArraySet&lt;&gt;();

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-02
    • 2012-05-23
    • 2021-12-26
    • 2019-04-26
    • 1970-01-01
    • 2015-02-24
    • 2020-06-17
    相关资源
    最近更新 更多