考虑无状态EJB
来自ejb 3.1 spec
容器将支持许多会话实例 bean同时执行;但是,每个实例只能看到一个 序列化的方法调用序列。因此,有状态或有 无状态会话bean不必编码为可重入
所以一个无国籍的seession bean可以"服务"一次至多一个请求, 这通常由管理bean池的容器实现。 所有这一切的伟大目标是线程安全。
我的问题是为什么我们需要这种形式的线程安全? 我的意思是Spring bean是单例而不是线程安全的(它们可以一次提供任意数量的请求),我们没有问题。
答案 0 :(得分:4)
如果无状态会话bean具有本身不是线程安全的成员变量(例如,SAXParser),则需要这种形式的线程安全性。但是,由于无状态会话bean没有像有状态会话bean那样的客户端关联,因此用例无疑是相对罕见的,并且servlet编程模型似乎已经证明这种保护级别可能不是必需的,所以如果你不这样做从EJB 3.1开始,需要线程安全性,您可以使用具有bean管理的并发性的单例会话bean。
线程安全限制还为EJB容器提供了一些额外的自由优化。例如,如果EJB容器知道一次只有一个线程可以使用无状态会话bean,那么它可以在方法入口/出口处操作注入对象的状态,以便这些对象不需要使用ThreadLocal(例如, UserTransaction或SessionContext)。