Abi*_*idi 3 java multithreading servlets
当多个线程访问/修改上下文变量但在会话级别不能产生相同的行为时,我已经尝试了不一致性.例如,当同一个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.
Run Code Online (Sandbox Code Playgroud)
我认为"线程安全方式"的含义是HttpSession访问方法保证是线程安全的,但是通过这些元素的方法对会话中存储的元素的所有访问都不能保证是线程安全的.
| 归档时间: |
|
| 查看次数: |
3705 次 |
| 最近记录: |