线程安全的哈希映射?

时间:2010-07-11 09:20:29

标签: java multithreading hashmap java.util.concurrent

我正在编写一个将HashMap返回给用户的应用程序。用户将获得对此MAP的引用。 在后端,我将运行一些线程来更新Map。

到目前为止我做了什么?


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


我遇到的问题


  1. 如果用户尝试更新MAP并同时在后端更新MAP - >并发写操作问题。
  2. 如果使用尝试从MAP读取内容并同时在后端更新MAP - >并发READ和WRITE操作问题。
  3. 直到现在我还没有遇到任何这样的问题,但我担心将来可能面临这样的问题。请给出sugesstions。

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

3 个答案:

答案 0 :(得分:53)

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

  1. 检查方法putIfAbsentreplace两者都是线程安全的,并结合检查hashmap的当前状态并将其更新为一个原子操作。
  2. get方法未在内部同步,但会返回可用的指定密钥的最新值(请查看ConcurrentHashMap class Javadoc for discussion)。
  3. ConcurrentHashMap优于Collections.synchronizedMap之类的好处是像putIfAbsent这样的组合方法,它们以内部同步的方式提供传统的地图getput逻辑。使用这些方法并且尝试通过ConcurrentHashMap提供您自己的自定义同步,因为它不起作用。 java.util.concurrent集合在内部同步,其他线程不会响应同步对象的尝试(例如synchronize(myConcurrentHashMap){}不会阻止其他线程。)

答案 1 :(得分:8)

旁注:

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

(这是Cliff的Google Talk点击这个无锁哈希。)

答案 2 :(得分:0)

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

  

支持完整的哈希表   检索和并发   可调节的预期并发性   updates.updates。

javadoc of ConcurrentHashMap