0

我只想Collection用于单线程环境,并且我使用的HashMap是同步的。

但是,我仍然怀疑同步它是否是线程安全的。

4

5 回答 5

4

如果您只使用单个线程,则不需要线程安全集合 -HashMap应该没问题。

您应该非常小心地制定出您的要求:

  • 如果您真的使用单线程,请坚持使用HashMap(或考虑LinkedHashMap
  • 如果您要共享地图,则需要确定您想要什么样的安全:
    • 如果地图在被刚刚读取的多个线程使用之前已完全填充,那么 HashMap仍然可以。
    • Collections.synchronizedMap只会同步每个单独的操作;在一个线程中迭代并在另一个线程中修改映射而不同步仍然是不安全的。
    • ConcurrentHashMap是一种更“彻底”的线程安全方法,我通常更喜欢synchronizedMap. 它允许在迭代期间进行修改,但不保证在迭代时会在哪里看到此类修改。另请注意,虽然HashMap允许空键和值,ConcurrentHashMap但不允许。
于 2013-03-01T06:46:15.717 回答
3

根据您的需要,使用ConcurrentHashMap. 它允许从多个线程同时修改 Map 而无需阻塞它们。Collections.synchronizedMap(map)创建一个会降低性能的阻塞映射,尽管会确保一致性

于 2013-03-01T06:43:24.677 回答
3
  1. 标准的 java HashMap 不同步。
  2. 如果您在单线程环境中,则无需担心同步。
于 2013-03-01T06:45:13.363 回答
0

常用的Collection类,例如java.util.ArrayList,是不同步的。但是,如果两个线程有​​可能同时更改一个集合,您可以使用该synchronizedCollection()方法从它生成一个同步集合。与只读方法类似,线程安全 API 允许您生成同步的集合、列表、集合或映射。例如,您可以通过以下方式从 a 生成同步地图HashMap

  Map map = Collections.synchronizedMap(new HashMap());
  map.put(...
于 2013-03-01T06:44:44.547 回答
0

作为单线程环境,您可以安全地使用 HashMap。

于 2013-03-01T06:44:55.277 回答