线程安全的哈希映射?

use*_*878 41 java multithreading hashmap java.util.concurrent

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

到目前为止我做了什么?


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


我遇到的问题


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

直到现在我还没有遇到任何这样的问题,但我担心将来我可能会面对.请给出sugesstions.

我在用 ConcurrentHashMap<String, String>.

kro*_*ock 53

你正在使用正确的轨道ConcurrentHashMap.对于每一点:

  1. 检查方法putIfAbsent,replace两者都是线程安全的,并结合检查hashmap的当前状态并将其更新为一个原子操作.
  2. GET方法是不是内部同步,但将返回最近的值提供给它指定的键(检查讨论的ConcurrentHashMap类的Javadoc).

ConcurrentHashMap类似于Collections.synchronizedMap组合方法的好处是以内部同步的方式putIfAbsent提供传统的Map getput逻辑.使用这些方法,不要尝试提供自己的自定义同步,ConcurrentHashMap因为它将无法正常工作.该java.util.concurrent集合被内部同步和其他线程不会在同步对象(例如,以努力作出响应synchronize(myConcurrentHashMap){}也不会妨碍其他线程).


mie*_*war 8

边注:

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

(以下是Cliff 的Google Talk点击此锁定免费哈希.)