会话范围的支持bean是否必须实现线程安全?

时间:2012-06-07 12:46:09

标签: java multithreading jsf servlets specifications

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

servlet规范说,有可能:

  

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

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

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

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

1 个答案:

答案 0 :(得分: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,不确定他们是否使用并行连接。