【问题标题】:Does a Collection which is Thread Safe have to be Synchronized?线程安全的集合是否必须同步?
【发布时间】:2013-02-15 14:51:44
【问题描述】:

我只想将Collection 用于单线程环境,并且我正在使用同步的HashMap

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

【问题讨论】:

    标签: java collections thread-safety hashmap synchronized


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:
        1. 标准的 java HashMap 没有同步。
        2. 如果您处于单线程环境中,则无需担心同步问题。

        【讨论】:

          【解决方案4】:

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

            Map map = Collections.synchronizedMap(new HashMap());
            map.put(...
          

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 2021-06-14
              • 2011-09-16
              • 1970-01-01
              • 2012-11-12
              • 1970-01-01
              • 1970-01-01
              • 2011-08-28
              • 1970-01-01
              相关资源
              最近更新 更多