【问题标题】:Thread safe Hash Map?线程安全的哈希映射?
【发布时间】:2011-03-14 10:40:19
【问题描述】:

我正在编写一个应用程序,它将向用户返回一个 HashMap。用户将获得此 MAP 的参考。 在后端,我将运行一些线程来更新地图。

到目前为止我做了什么?


我已经让所有后端线程共享一个公共通道来更新 MAP。所以在后端我确信并发写操作不会成为问题。


我遇到的问题


  1. 如果用户尝试更新 MAP 并且同时在后端更新 MAP --> 并发写入操作问题。
  2. 如果用户尝试从 MAP 读取某些内容,同时 MAP 正在后端更新 --> 并发 READ 和 WRITE 操作问题。

到目前为止,我还没有遇到任何此类问题,但我担心我将来可能会遇到。请给出建议。

我正在使用ConcurrentHashMap<String, String>.

【问题讨论】:

    标签: java multithreading hashmap java.util.concurrent


    【解决方案1】:

    您使用ConcurrentHashMap 走在正确的轨道上。对于每个点:

    1. 查看putIfAbsentreplace 方法,它们都是线程安全的,并且将检查hashmap 的当前状态并将其更新为一个原子操作。
    2. get 方法在内部不同步,但会返回可用的指定键的最新值(检查ConcurrentHashMap class Javadoc for discussion)。

    ConcurrentHashMap 相对于 Collections.synchronizedMap 之类的好处是组合方法,例如 putIfAbsent,它以内部同步的方式提供传统 Map getput 逻辑。使用这些方法并且不要尝试通过ConcurrentHashMap 提供您自己的自定义同步,因为它不起作用。 java.util.concurrent 集合是内部同步的,其他线程不会响应同步对象的尝试(例如,synchronize(myConcurrentHashMap){} 不会阻塞其他线程)。

    【讨论】:

    • ConcurrentHashMap 与 ConcurrentSkipListMap 相比如何?
    【解决方案2】:

    旁注:

    您可能想查看 Cliff Click 的无锁哈希表实现,它是 Highly Scalable Java 库的一部分

    (这是 Cliff Click 的 Google Talk 关于此无锁哈希的内容。)

    【讨论】:

      【解决方案3】:

      ConcurrentHashMap 的设计和实现是为了避免您描述的场景出现任何问题。您无需担心。

      支持完整的哈希表 检索的并发性和 可调整的预期并发性 更新。更新。

      javadoc of ConcurrentHashMap

      【讨论】:

        猜你喜欢
        • 2012-12-05
        • 1970-01-01
        • 1970-01-01
        • 2014-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-12
        相关资源
        最近更新 更多