2012-06-07 38 views
3

是否有可能会同时由多个线程访问会话范围的支持bean?会话范围的支持bean是否必须实现线程安全?

servlet规范说,这是可能的:

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

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

我也通过在后台bean中用断点阻塞线程来验证这一点。在我重新开始线程之前,无法在同一会话的其他选项卡中执行任何操作。

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

+1

这是相关的:http://stackoverflow.com/questions/6010164/why-should-we-make-a-sessionscoped-managedbean-thread-safe-in-jsf –

回答

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。

+0

谢谢你的回答,它是什么意思是支持bean?它是否必须实现线程安全,即使它是会话作用域? – Sandro

+0

是的,显然如果你有状态。 –