【发布时间】:2019-10-04 08:44:04
【问题描述】:
我正在使用Collections.synchronizedList,我有多个线程构建此列表。然而,在它建成后,我只有一个线程遍历它。在这种情况下,以下内容是否仍然必不可少?
用户必须手动同步返回的 迭代时列出:
List list = Collections.synchronizedList(new ArrayList()); ... synchronized (list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); }
【问题讨论】:
-
如果所有线程都完成了您的列表的构建,为什么您需要对单线程访问它进行并发控制?
-
没有。作为额外的完整性检查/措施,您可以将其包装在
Collections.unmodifiableList中,或者为了加快速度将数据复制到新列表(与您的关注无关)。 -
这就是我的意思,只是证实了我的怀疑
-
如果您可以确保在构建列表后对列表进行单线程访问,那么就无法理解为什么没有同步的迭代会成为问题。迭代器提供对备份列表的直接访问,只要确保它没有被滥用
-
警告只是说 结构 不能真正处理由另一个线程更改的迭代器:本地迭代器的状态未更新。
标签: java