如果我在httpsession中存储并发hashmap,那么如何以线程安全方式使用此hashmap?通过使用hashmap,我的意思是以线程安全的方式从hashmap中添加和检索。
getitng / put这个hashmap时我应该锁定什么对象?
这段代码很好:
private static final String SESSION_KEY_USER_IDENT = "CloudIdentityUserListMap";
private someSessionPopulateFunc()
{
final Object lock = sess.getHttpSession().getId().intern();
ConcurrentHashMap<String, List<User>> cloudIdentityUserListMap;
if (sess.getAttribute(SESSION_KEY_USER_IDENT) != null) {
synchronized (lock) {
cloudIdentityUserListMap = (ConcurrentHashMap<String, List<User>>) sess.getAttribute(SESSION_KEY_USER_IDENT);
}
} else {
cloudIdentityUserListMap = new ConcurrentHashMap<String, List<User>>();
synchronized (lock) {
sess.setAttribute (SESSION_KEY_USER_IDENT, cloudIdentityUserListMap);
}
}
cloudIdentityUserListMap.putIfAbsent(cloudIdentity,users);
}
我是否需要在从此并发哈希地图读取值时再次获取对sess.getHttpSession()。getId()。intern()的锁定?
答案 0 :(得分:0)
来自Java Servlet Specification 3.0:
7.7.1线程问题
执行请求线程的多个servlet可以具有对它的活动访问权限 会话对象同时出现。容器必须确保操纵 表示会话属性的内部数据结构在线程中执行 安全的方式。开发人员负责线程安全访问 属性对象本身。这将保护内部的属性集合 来自并发访问的HttpSession对象,消除了一个机会 应用程序导致该集合被破坏。
但HttpSession
是哈希映射。很难理解为什么你需要一个嵌套的。
ConcurrentHashMap
也已经是线程安全的。