【问题标题】:Should I use ConcurrentHashMap or HashMap if I threads don't change structure of map?如果我的线程不改变地图的结构,我应该使用 ConcurrentHashMap 还是 HashMap?
【发布时间】:2020-08-08 18:05:48
【问题描述】:

对于这种情况,我是否需要 Java 中的 ConcurrentHashMap:

在将 HashMap 传递给一堆线程之前,我使用所有必要的键启动映射:

Key = "thread1Key", Value = null
Key = "thread2Key", Value = null
Key = "thread3Key", Value = null
...

每个任务都是 Runnable 的一部分(由线程执行),并被分配以更改这些键中只有 1 个的值。它是预先分配的。换句话说,我不需要担心多个 Runnable 可能会改变 hashmap 中的同一个键的情况。

在这种情况下是需要 ConcurrentHashMap 还是常规 HashMap 可以?为什么?

谢谢!

【问题讨论】:

    标签: java concurrency hashmap concurrenthashmap


    【解决方案1】:

    HashMap 的这种用法是安全的,无需额外同步。 docs 准确描述了您的用例:

    如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改映射,则必须在外部同步。 (结构修改是添加或删除一个或多个映射的任何操作;仅更改与实例已包含的键关联的值不是结构修改。)

    【讨论】:

    • 地图发生碰撞时会发生什么?
    • 不可能发生碰撞。不会添加新密钥。在传递给线程之前添加所有键。
    【解决方案2】:

    HashMap 在这种情况下可能在结构上保持一致,但也存在其值的可见性问题。如果在一个线程中更改了值,则不能保证其他线程可以看到它。或者如果是,那么它也可能是不一致的,因为它没有在线程之间安全地发布。

    【讨论】:

      【解决方案3】:

      如果没有删除地图中的条目,则常规地图就足够了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-22
        • 2011-06-02
        相关资源
        最近更新 更多