线程安全哈希映射?

我正在写一个应用程序,将返回一个HashMap给用户。 用户将得到这个MAP的参考。 在后端,我将运行一些将更新地图的线程。

我到目前为止做了什么?


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


我遇到的问题


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

直到现在我还没有遇到这样的问题,但是我担心我将来可能会面临这样的问题。 请给予sugesstions。

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

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

  1. 检查putIfAbsent方法并replace两者都是线程安全的,并结合检查hashmap的当前状态并将其更新为一个primefaces操作。
  2. get方法在内部不同步,但会返回指定可用键的最新值(请检查ConcurrentHashMap类Javadoc )。

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

边注:

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

(这里是一个由Cliff的Google Talk单击关于这个免费的哈希。)

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

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

ConcurrentHashMap的javadoc