【发布时间】:2013-02-15 14:51:44
【问题描述】:
我只想将Collection 用于单线程环境,并且我正在使用同步的HashMap。
但是,我仍然怀疑同步它是否是线程安全的。
【问题讨论】:
标签: java collections thread-safety hashmap synchronized
我只想将Collection 用于单线程环境,并且我正在使用同步的HashMap。
但是,我仍然怀疑同步它是否是线程安全的。
【问题讨论】:
标签: java collections thread-safety hashmap synchronized
如果您只使用单个线程,则不需要线程安全集合 - HashMap 应该没问题。
你应该非常小心地制定出你的要求:
HashMap(或考虑使用LinkedHashMap)HashMap 还是可以的。Collections.synchronizedMap 只会同步每个单独的操作;它仍然不是
安全地在一个线程中迭代并在另一个线程中修改映射而无需同步。ConcurrentHashMap 是一种更“彻底”的线程安全方法,我通常更喜欢这种方法
超过synchronizedMap。它允许在迭代期间进行修改,但不保证
在迭代时会看到这样的修改。另请注意,虽然 HashMap 允许 null
键和值,ConcurrentHashMap 没有。【讨论】:
根据您的需要,请使用ConcurrentHashMap。它允许从多个线程同时修改 Map 而无需阻塞它们。 Collections.synchronizedMap(map) 创建一个阻塞 Map 会降低性能,但会确保一致性
【讨论】:
【讨论】:
常用的Collection类,如java.util.ArrayList,是不同步的。但是,如果两个线程有可能同时更改一个集合,您可以使用synchronizedCollection() 方法从中生成一个同步集合。与只读方法类似,线程安全 API 允许您生成同步的集合、列表、集合或映射。例如,您可以通过以下方式从 HashMap 生成同步地图:
Map map = Collections.synchronizedMap(new HashMap());
map.put(...
【讨论】:
作为单线程环境,您可以安全地使用 HashMap。
【讨论】: