4

是否有可能多个线程同时访问会话范围的支持 bean?

servlet 规范说,有可能:

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

但是我不能让服务器(JBoss)对同一个会话使用不同的线程。当我打开多个选项卡并在一个选项卡中启动长时间运行的请求,然后在另一个选项卡中启动请求时,第二个选项卡必须等待响应,直到第一个选项卡中启动的操作完成。

我还通过在支持 bean 中使用断点阻塞线程来验证这一点。在我恢复线程之前,无法在同一会话的其他选项卡中执行任何操作。

尽管如此,我们在生产日志中有一些奇怪的异常,到目前为止,我们唯一可能的解释是,多个线程同时访问同一个会话范围的支持 bean。

4

1 回答 1

2

是的,A Servlet session is thread safe。但是,如果您将可变对象放入会话中。应用程序应该负责同步。

在你的情况下,if your Bean is Mutable i.e, has state. Yes it has to be thread safe.

关于您的测试用例,这取决于您使用的浏览器。大多数浏览器最多支持每台服务器并行连接 6 个。但是,如果有 cookie,不确定他们是否使用并行连接。

于 2012-06-07T13:47:18.543 回答