是否必须同步一个线程安全的集合?

时间:2013-03-01 06:42:08

标签: java collections thread-safety hashmap synchronized

我只想将Collection用于单线程环境,而我使用的是同步的HashMap

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

5 个答案:

答案 0 :(得分:4)

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

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

  • 如果您真的使用单个帖子,请坚持使用HashMap(或考虑LinkedHashMap
  • 如果您正在分享地图,则需要确定您想要的安全性:
    • 如果地图在完全填充之前被多个线程使用,那么只读取 HashMap仍然没问题。
    • Collections.synchronizedMap只会同步每个操作;它仍然不是 安全地在一个线程中迭代并在没有同步的情况下修改另一个线程中的映射。
    • ConcurrentHashMap是一种更“彻底”的线程安全方法,我通常更喜欢这种方法 超过synchronizedMap。它允许在迭代期间进行修改,但不保证 在迭代时会看到这样的修改。另请注意,虽然HashMap允许null 键和值,ConcurrentHashMap没有。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

  1. 标准java HashMap未同步。
  2. 如果您处于单线程环境中,则无需担心同步。

答案 3 :(得分:0)

常用的Collection类(例如java.util.ArrayList)未同步。但是,如果两个线程有​​可能同时更改集合,则可以使用synchronizedCollection()方法从中生成同步集合。与只读方法类似,线程安全API允许您生成同步的集合,列表,集或映射。例如,您可以使用HashMap

生成同步地图
  Map map = Collections.synchronizedMap(new HashMap());
  map.put(...

答案 4 :(得分:0)

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