如何在java中的httpsession中安全地存储hashmap

时间:2017-07-16 04:15:22

标签: java servlets concurrenthashmap httpsession

如果我在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()的锁定?

1 个答案:

答案 0 :(得分:0)

来自Java Servlet Specification 3.0:

  

7.7.1线程问题

     

执行请求线程的多个servlet可以具有对它的活动访问权限   会话对象同时出现。容器必须确保操纵   表示会话属性的内部数据结构在线程中执行   安全的方式。开发人员负责线程安全访问   属性对象本身。这将保护内部的属性集合   来自并发访问的HttpSession对象,消除了一个机会   应用程序导致该集合被破坏。

HttpSession 是哈希映射。很难理解为什么你需要一个嵌套的。

ConcurrentHashMap也已经是线程安全的。