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