我正在编写一个应用程序,它将返回一个 HashMap 给用户。用户将获得此地图的参考。
在后端,我将运行一些线程来更新地图。
到目前为止我做了什么?
我已经创建了所有后端线程,因此共享一个公共通道来更新 MAP。因此,在后端,我确信并发写入操作不会成为问题。
我遇到的问题
- 如果用户尝试更新 MAP,并且同时 MAP 正在后端更新 --> 并发写入操作问题。
- 如果用户尝试从 MAP 读取某些内容,并且同时 MAP 正在后端更新 --> 并发读取和写入操作问题。
到目前为止我还没有遇到过这样的问题,但我担心将来可能会遇到。请给建议。
我在用ConcurrentHashMap<String, String>.
你在正确的轨道上使用ConcurrentHashMap http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html。对于每个点:
- 查看方法putIfAbsent http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html#putIfAbsent(K%2C%20V) and replace http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html#replace(K%2C%20V)两者都是线程安全的,并且结合了检查哈希图的当前状态并将其更新为一个原子操作。
- The get http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html#get(java.lang.Object)方法内部不同步,但会返回可用的指定键的最新值(检查ConcurrentHashMap 类 Javadoc 供讨论 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/ConcurrentHashMap.html).
的好处是ConcurrentHashMap
在类似的事情上Collections.synchronizedMap http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Collections.html#synchronizedMap(java.util.Map)组合方法是这样的putIfAbsent
提供传统地图get
and put
逻辑以内部同步的方式。使用这些方法和do not尝试提供您自己的自定义同步ConcurrentHashMap
因为它不会起作用。这java.util.concurrent
集合是内部同步的,其他线程不会响应同步对象的尝试(例如synchronize(myConcurrentHashMap){}
不会阻塞其他线程)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)