我们都知道,当使用Collections.synchronizedXXX
(例如synchronizedSet()
)时,我们会得到底层集合的同步“视图”。
然而,这些包装器生成方法的文档指出,当使用迭代器迭代集合时,我们必须在集合上显式同步。
您选择哪个选项来解决此问题?
我只看到以下几种方法:
在调用iterator()
CopyOnWriteArrayList
/Set),
还有一个额外的问题:当使用同步视图时,foreach/Iterable的使用是线程安全的吗?
发布于 2010-12-23 18:15:27
你已经回答了你的额外问题:不,使用增强的for循环是不安全的-因为它使用了迭代器。
至于哪种方法是最合适的-这实际上取决于你的上下文:
CopyOnWriteArrayList
可能是最appropriate.发布于 2010-12-23 18:18:05
取决于您的访问模型。如果您的并发较低且写入频率较高,则1的性能最佳。如果您有高并发和不频繁的写入,3将具有最佳性能。选项2在几乎所有情况下都会表现不佳。
foreach
调用iterator()
,因此完全相同的事情也适用。
发布于 2010-12-23 21:39:12
您可以使用Java5.0中添加的较新的集合之一,该集合支持在迭代时进行并发访问。另一种方法是使用toArray进行复制,这是线程安全的(在复制期间)。
Collection<String> words = ...
// enhanced for loop over an array.
for(String word: words.toArray(new String[0])) {
}
https://stackoverflow.com/questions/4517653
复制相似问题