43

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

到目前为止我做了什么?


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


我遇到的问题


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

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

我在用ConcurrentHashMap<String, String>.

4

3 回答 3

58

您使用ConcurrentHashMap. 对于每个点:

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

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

于 2010-07-11T10:00:31.540 回答
8

边注:

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

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

于 2010-07-11T09:37:21.303 回答
1

ConcurrentHashMap 的设计和实现是为了避免您描述的场景出现任何问题。你没有什么可担心的。

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

ConcurrentHashMap的javadoc

于 2010-07-11T10:01:22.053 回答