【发布时间】:2014-02-23 21:55:38
【问题描述】:
我有一个被许多线程不断扩展的 Set:
Set<String> concurrentSet = new CopyOnWriteArraySet<>();
有时我会处理集合中的元素,因为我不再需要处理过的元素,所以我使用 iterator.remove() 删除它们:
Iterator<String> i = concurrentSet .iterator();
while (i.hasNext()) {
String str = i.next();
//processing...
i.remove();
}
这是线程安全的吗?如果线程在迭代时添加元素怎么办?
注意:doc 声明“如果在迭代过程中通过调用此方法以外的任何方式修改了基础集合,则迭代器的行为是未指定的。” => CopyOnWriteArraySet 也是这样吗?
【问题讨论】:
-
什么是
ConcurrentHashSet?它不是 jdk 的一部分... -
感谢评论,我改成了jdk提供的线程安全集实现
-
这不是一个很好的例子:“迭代器不支持可变删除操作。”!
标签: java multithreading concurrency iterator set