首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java Servlet上下文和会话级别变量

Java Servlet上下文和会话级别变量
EN

Stack Overflow用户
提问于 2011-03-26 23:58:19
回答 3查看 3.9K关注 0票数 3

我已经试验了当多个线程访问/修改上下文变量时的不一致性,但不能在会话级别产生相同的行为。例如,在服务方法中调用session.setAttribute("something")方法,当两个相同会话in的请求(这意味着两个线程)进入时,不会导致竞争条件。是因为Tomcat为会话变量提供了线程安全,还是我完全搞错了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-27 00:09:41

Servlet规范3.0版在7.7.1小节中明确指出,对会话密钥的访问是线程安全的。但是,对存储在这些键下的元素的访问不是线程安全的。在这种情况下,应用程序开发人员必须确保线程安全。

7.7.1线程问题执行请求线程的多个servlet可能同时具有对同一会话对象的主动访问权限。容器必须确保以线程安全的方式操作表示会话属性的内部数据结构。开发人员负责对属性对象本身进行线程安全访问。这将保护HttpSession对象内的属性集合不受并发访问,从而消除应用程序导致该集合损坏的机会。

示例代码来说明这一点:

代码语言:javascript
代码运行次数:0
运行
复制
HttpSession session;
List items;
session.put("cart", items); // thread1 writes cart reference to session, this is thread-safe
...
items = session.get("cart"); // thread1 reads cart reference from session, this is thread-safe
items.get(0); // access to elements of application collection is *not* thread-safe, you must use explicit synchronization here.

我相信这里所说的“线程安全方式”的意思是,HttpSession访问方法可以保证是线程安全的,但是不能保证这些元素的方法对存储在会话中的元素的所有访问都是线程安全的。

票数 6
EN

Stack Overflow用户

发布于 2011-03-27 00:05:46

在阅读了一下this bug fix之后,我确实得到了一个强烈的印象:会话是线程安全的,或者说应该是线程安全的。

票数 1
EN

Stack Overflow用户

发布于 2011-03-27 00:14:48

你知道所有的上下文变量都是线程不安全的,除了本地,所以如果你试图访问/修改这个上下文变量使用锁,在java中它是synchronized对象,有关更多信息,请阅读Head First Servlet& JSP -第5章。祝好运!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5443464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档