是否有可能会同时由多个线程访问会话范围的支持bean?会话范围的支持bean是否必须实现线程安全?
servlet规范说,这是可能的:
执行请求线程多个servlet可以具有在同一时间活动的访问相同的 会话对象。容器必须确保以线程 安全的方式执行代表会话属性的内部数据结构的操纵。开发人员有责任线程安全地访问 属性对象本身。这将保护HttpSession对象内的属性集合免受并发访问,从而消除了应用程序导致该集合损坏的机会。
但是我无法让服务器(JBoss)在同一个会话中使用不同的线程。当我打开多个选项卡并在一个选项卡中启动一个长时间运行的请求,然后在另一个选项卡中启动请求时,第二个选项卡必须等待响应,直到在第一个选项卡中开始的操作完成。
我也通过在后台bean中用断点阻塞线程来验证这一点。在我重新开始线程之前,无法在同一会话的其他选项卡中执行任何操作。
尽管如此,我们在生产日志中还是有一些奇怪的例外,到目前为止我们唯一可能的解释是,多个线程同时访问同一个会话范围的支持bean。
这是相关的:http://stackoverflow.com/questions/6010164/why-should-we-make-a-sessionscoped-managedbean-thread-safe-in-jsf –