繁体   English   中英

Java Servlet上下文和会话级变量

[英]Java Servlet Context and Session level variables

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

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

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

示例代码来说明这一点:

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访问方法保证是线程安全的,但是通过这些元素的方法对会话中存储的元素的所有访问都不能保证是线程安全的。

阅读了一下(其中包括这个错误修复 ),我确实得到了强烈的印象,即会话是线程安全的,或者应该是。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM