首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >集合上的线程安全迭代

集合上的线程安全迭代
EN

Stack Overflow用户
提问于 2010-12-23 18:00:36
回答 8查看 31.6K关注 0票数 19

我们都知道,当使用Collections.synchronizedXXX (例如synchronizedSet())时,我们会得到底层集合的同步“视图”。

然而,这些包装器生成方法的文档指出,当使用迭代器迭代集合时,我们必须在集合上显式同步。

您选择哪个选项来解决此问题?

我只看到以下几种方法:

在调用iterator()

  • Use集合之前,先在collection

  • Clone上同步集合,该迭代器是线程安全的(我只知道CopyOnWriteArrayList/Set)

  1. )

还有一个额外的问题:当使用同步视图时,foreach/Iterable的使用是线程安全的吗?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-12-23 18:15:27

你已经回答了你的额外问题:不,使用增强的for循环是不安全的-因为它使用了迭代器。

至于哪种方法是最合适的-这实际上取决于你的上下文:

  • 是不是很少写入?如果是这样的话,CopyOnWriteArrayList可能是最appropriate.
  • Is的集合合理的小,并且迭代快?(例如,你在循环中没有做太多的工作)如果是这样,同步可能很好-特别是如果这种情况不经常发生的话(例如,你不会有太多的collection).
  • If争用你正在做大量的工作,并且不想在同一时间阻止其他线程工作,克隆集合的成功可能是可以接受的。
票数 27
EN

Stack Overflow用户

发布于 2010-12-23 18:18:05

取决于您的访问模型。如果您的并发较低且写入频率较高,则1的性能最佳。如果您有高并发和不频繁的写入,3将具有最佳性能。选项2在几乎所有情况下都会表现不佳。

foreach调用iterator(),因此完全相同的事情也适用。

票数 6
EN

Stack Overflow用户

发布于 2010-12-23 21:39:12

您可以使用Java5.0中添加的较新的集合之一,该集合支持在迭代时进行并发访问。另一种方法是使用toArray进行复制,这是线程安全的(在复制期间)。

代码语言:javascript
复制
Collection<String> words = ...
// enhanced for loop over an array.
for(String word: words.toArray(new String[0])) {

}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4517653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档