线程安全哈希映射?
我正在写一个应用程序,将返回一个HashMap给用户。 用户将得到这个MAP的参考。 在后端,我将运行一些将更新地图的线程。
我到目前为止做了什么?
我已经使所有后端线程共享一个公共通道来更新MAP。 所以在后端,我确信并发写入操作不会成为问题。
我遇到的问题
- 如果用户试图更新MAP,同时在后端更新MAP – >并发写入操作问题。
- 如果使用尝试从MAP中读取某些内容,并且同时MAP正在后端更新 – >并发READ和WRITE操作问题。
直到现在我还没有遇到这样的问题,但是我担心我将来可能会面临这样的问题。 请给予sugesstions。
我正在使用ConcurrentHashMap<String, String>.
您正在使用ConcurrentHashMap
在正确的轨道上。 对于每个点:
- 检查
putIfAbsent
方法并replace
两者都是线程安全的,并结合检查hashmap的当前状态并将其更新为一个primefaces操作。 - get方法在内部不同步,但会返回指定可用键的最新值(请检查ConcurrentHashMap类Javadoc )。
ConcurrentHashMap
比Collections.synchronizedMap
的好处是像putIfAbsent
这样的组合方法,它们以内部同步的方式提供传统的Map get
和put
逻辑。 使用这些方法, 不要尝试通过ConcurrentHashMap
提供自己的自定义同步,因为它不起作用。 java.util.concurrent
集合是内部同步的,其他线程不会响应同步对象的尝试(例如, synchronize(myConcurrentHashMap){}
不会阻塞其他线程)。
边注:
您可能想要查看由Cliff Click实现的无锁哈希表,它是高度可扩展的Java库的一部分
(这里是一个由Cliff的Google Talk单击关于这个免费的哈希。)
ConcurrentHashMap的devise和实现是为了避免你描述的场景出现任何问题。 你没有什么可担心的。
一个哈希表,支持完全并发的检索和可调整预期的并发update.updates。
ConcurrentHashMap的javadoc