我有一个@Singleton
会话bean。该bean使用@ConcurrencyManagement
(
ConcurrencyManagementType.BEAN
)
进行注释。
它通过SessionContext
注释注入@Resource
。
这是SessionContext
本质上线程安全吗(因为它是一个容器生成的对象,也用于非bean管理的并发情况),或者我的bean必须在锁上同步才能访问和操作它? EJB 3.1 specification的第16.15.2节未提及注入EJBContext
个对象的线程安全性。
答案 0 :(得分:1)
来自a posting by Marina Vatkina on the users@ejb-spec.java.net
mailing list:
非单例bean中的
EJBContext
只能由单个线程访问,因此它不需要是线程安全的。如果我们在4.8.5单例会话Bean并发部分中使用以下文本,那么如果多个线程可以同时访问该单例实例,则使开发人员有责任确保上下文是线程安全的:“在单例会话bean实例状态中存储不支持并发访问的Java EE对象(例如,对Java持久性实体管理器或有状态会话bean的引用)是合法的。但是,Bean提供程序负责确保一次不能通过多个线程访问这些对象。“
答案 1 :(得分:0)
上下文对象必须是线程安全的,并且几乎可以肯定使用线程局部变量来实现它(事实上,一旦你意识到容器只是操纵线程局部变量,就可以理解Java EE的许多神秘部分: java:comp,security,transaction等)。否则,EJB容器实现没有其他方法可以从getInvokedBusinessInterface,wasCancelCalled等返回可靠的结果。
例如,假设一个不是线程安全的EJBContext实现;即,它有一个成员变量invokedBusinessInterface和一个set容器调用Bean方法之前调用的setInvokedBusinessInterface方法。在这种情况下,如果同时调用两个单例方法,其中一个线程必然会从getInvokedBusinessInterface得到错误的答案,并且bean方法可以应用的任何数量的同步都不能解决这个问题。