加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – ServletContext对象的线程安全性

发布时间:2020-12-15 03:14:55 所属栏目:Java 来源:网络整理
导读:我在我的ServletContext中存储了一个HashMap对象. 但是多个请求线程正在读取和修改此HashMap. 因为我相信ServletContext对象是在请求线程之间共享的,我是否需要同步对此HashMap的访问?或者还有其他更好的方法来实现同样的目标吗? 解决方法 通过ServletCont
我在我的ServletContext中存储了一个HashMap对象.
但是多个请求线程正在读取和修改此HashMap.

因为我相信ServletContext对象是在请求线程之间共享的,我是否需要同步对此HashMap的访问?或者还有其他更好的方法来实现同样的目标吗?

解决方法

通过ServletContext#setAttribute发布属性是线程安全的!这可以从 Java Servlet规范,第4.5章得出:( …)任何属性绑定
进入上下文可用于属于同一Web的任何其他servlet
应用.(…).

(原因:使对象可用于其他servlet也意味着它们可供其他线程使用.这是唯一可能的,如果使用正确的同步,则ServletContext#setAttribute必须同步).

因此,通过ServletContext#getAttribute读取已发布的属性也是如此.

但是当然如果像HashMap这样的对象在不同的??线程之间共享,开发人员必须确保以适当的线程安全的方式访问这个共享对象本身!如您在问题的其他答案中所述,使用ConcurrentHashMap是一种可能的解决方案,但在初始化属性时无法解决竞争条件,因为null检查不是原子的:

ConcurrentMap<String,Object> shared = (...)servletContext.getAttribute("sharedData");
if (shared == null) {
    shared = new ConcurrentHashMap<>();
    servletContext.setAttribute("sharedData",shared);
}

因此,ServletContextListener可用于在Web应用程序启动时初始化上下文!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读