在应用程序范围内的bean中,我们有一个hashmap,它为每个用户保存一些计数器(只是瞬态,不保存在任何地方)每个用户都由它自己的子hashmap表示:
Map<String, Map<String, Object>> userValues = new HashMap<String, Map<String, Object>>();
例如:
application.getUserValues().get(user.id).put("lastAction", new Date());
每个Sub-Hash-Map在启动期间初始化为空(单线程)。每个Sub-Hash-Map都保证只能被修改(&#34; put&#34 ;,永远不会删除)而不是被替换。
Sub-Hash-Maps上的写访问保证只能由单个线程在任何时间发生,但如上例所示,可能有2个线程同时修改两个不同的子映射)
我们没有使用SessionScope,因为一些信息也需要暴露给其他会话(即Teamlead应该能够看到这些值)
到目前为止,从来没有出现过并发问题,但并发性总是难以“测试”#34;因为它主要取决于整个系统负载和大约在同一时间执行的操作。
遵循以下主题:Is ConcurrentHashMap.get() guaranteed to see a previous ConcurrentHashMap.put() by different thread?我认为,对内部hashmap使用Concurrent Hashmaps可以完全确保在同一个地图上使用put
和get
时没有问题来自不同线程的时间。
所以最好使用Map<String, ConcurrentHashMap<String, Object>>
吧?
是否还需要对&#34;外部&#34;使用ConcurrentHashmap?地图?该地图永远不会更改,只有该地图的操作才会get()
。
答案 0 :(得分:1)
如果多个线程访问了同一个子图,并且它们也写入了地图,则ConcurrentHashMap是有意义的。如果他们只是在最初只写一次时读取数据,甚至在多个线程开始说例如初始化之前,那么你就不需要concurrentHashMap。
同样你也需要考虑外部地图。