Java Servlet 上下文和 session 级变量

标签 java multithreading servlets

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

最佳答案

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

7.7.1 线程问题 执行请求线程的多个 servlet 可以主动访问同一个线程 session 对象同时。容器必须确保操纵 表示 session 属性的内部数据结构在线程中执行 安全的方式。开发人员有责任线程安全地访问 属性对象本身。这将保护内部的属性集合 来自并发访问的 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 访问方法保证是线程安全的,但是所有对存储在 session 中的元素的访问都是通过这些方法elements 不保证是线程安全的。

关于Java Servlet 上下文和 session 级变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5443464/

相关文章:

c - pthread_create 更改数组的值

c++ - shared_timed_mutex 在 OS X 10.11.2 上不可用?

java - 初始化上下文时不会调用 ServletContextListener.contextInitialized

java - Servlet页面显示404错误,不出现

java - 使用 JAXB 支持略有变化的模式

java - Cassandra部署集群失败

java - 如何将数据从 BroadcastReceiver 传递到主 Activity ?

c# - 我如何使用线程在 XNA 中运行数据库查询?

用于登录的身份验证过滤器和 servlet

java - 策略模式,这个正确吗