我已经试验了当多个线程访问/修改上下文变量时的不一致性,但不能在会话级别产生相同的行为。例如,在服务方法中调用session.setAttribute("something")方法,当两个相同会话in的请求(这意味着两个线程)进入时,不会导致竞争条件。是因为Tomcat为会话变量提供了线程安全,还是我完全搞错了?
发布于 2011-03-26 16:09:41
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
访问方法可以保证是线程安全的,但是不能保证这些元素的方法对存储在会话中的元素的所有访问都是线程安全的。
发布于 2011-03-26 16:05:46
在阅读了一下this bug fix之后,我确实得到了一个强烈的印象:会话是线程安全的,或者说应该是线程安全的。
发布于 2011-03-26 16:14:48
你知道所有的上下文变量都是线程不安全的,除了本地,所以如果你试图访问/修改这个上下文变量使用锁,在java中它是synchronized
对象,有关更多信息,请阅读Head First Servlet& JSP -第5章。祝好运!
https://stackoverflow.com/questions/5443464
复制相似问题