java - 如何在没有并发修改异常的情况下进行连续循环收集
问题描述
请仔细阅读文字,标题不太好,但我想不出更容易描述问题的东西。
这是一个理论问题,我将使用 java 来演示,但我需要的解决方案更像是一种设计模式,因此它可能是任何语言的思想。
一个程序有 2 个线程:
线程 A - 与用户交互,用户可以向集合中添加或删除项目
线程 B - 不断迭代集合,对其项目执行任务
我怎么能在没有的情况下执行这个场景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 的任何线程访问上述集合。但它不是实时的,即集合可以改变,这不会反映在正在进行的迭代中。这是线程安全迭代器的一个缺点
推荐阅读
- php - PHP - 数组搜索不返回任何内容
- angularjs - 加载子控制器时调用父控制器
- javascript - Selectize.js:使用默认值填充
- javascript - 如何从 Firebase 快照返回数组
- nginx - nginx centos 7服务器多个网站
- c++ - 如何在 C++ 中使用自动换行符实现日志记录宏
- kotlin - Kotlin 语言是如何用 Kotlin 编写的?
- php - PHP 在 0x03 End of Text 后停止在二进制字符串循环中工作
- amazon-web-services - AWS Lambda@Edge 的缓存选项
- javascript - jQuery UI,响应式调整最后一个 div