【发布时间】:2011-05-29 21:27:18
【问题描述】:
我们都知道,当使用Collections.synchronizedXXX(例如synchronizedSet())时,我们会获得底层集合的同步“视图”。
但是,这些包装器生成方法的文档声明我们必须在使用迭代器迭代集合时显式地在集合上同步。
您选择哪个选项来解决这个问题?
我只能看到以下几种方法:
- 按照文档所述进行操作:在集合上同步
- 在调用
iterator()之前克隆集合 - 使用迭代器是线程安全的集合(我只知道
CopyOnWriteArrayList/Set)
还有一个额外的问题:使用同步视图时 - 使用 foreach/Iterable 线程安全吗?
【问题讨论】:
-
或者可能通过使用 ExecutorService 等来避免共享使用迭代器(使用迭代器将新的 Callable/Runnable 添加到 ExecutorService)。其他一些集合类型将自己标榜为“线程安全”我想知道他们的迭代器是否:stackoverflow.com/a/3362063/32453(我怀疑它)
标签: java multithreading collections iterator thread-safety