1

我有一个@Singleton会话 bean。bean 用 注释。@ConcurrencyManagement( ConcurrencyManagementType.BEAN)

它通过注释SessionContext注入了它。@Resource

SessionContext本质上是线程安全的(因为它是容器生成的对象,也用于非 bean 管理的并发情况),还是我的 bean 必须在锁上同步才能访问和操作它?EJB 3.1 规范的第 16.15.2 节没有提到注入EJBContext对象的线程安全。

4

2 回答 2

1

上下文对象必须是线程安全的,并且几乎可以肯定它使用线程局部变量来实现这一点(事实上,一旦您意识到容器只是在操作线程局部变量,Java EE 的许多神秘部分就可以理解:java:comp 、安全、交易等)。否则,EJB 容器实现没有其他方法可以从 getInvokedBusinessInterface、wasCancelCalled 等返回可靠结果。

例如,想象一个不是线程安全的 EJBContext 实现;即,它有一个成员变量 invokedBusinessInterface 和一个 setInvokedBusinessInterface 方法,EJB 容器将在调用 bean 方法之前调用它们。在这种情况下,如果同时调用两个单例方法,其中一个线程必然会从 getInvokedBusinessInterface 得到错误的答案,并且 bean 方法可以应用的同步量无法解决这个问题。

于 2012-08-21T12:48:41.653 回答
1

来自Marina Vatkina 在users@ejb-spec.java.net邮件列表中的帖子:

EJBContext在非单例 bean 中,只能由单个线程访问,因此它不需要是线程安全的。如果我们在 4.8.5 单例会话 Bean 并发部分中使用以下文本,如果多个线程可以同时访问该单例实例,则确保上下文是线程安全的成为开发人员的责任:

“在单例会话 bean 实例状态中存储不支持并发访问的 Java EE 对象(例如对 Java Persistence 实体管理器或有状态会话 bean 的引用)是合法的。但是,确保此类对象是 Bean Provider 的责任一次不能被多个线程访问。”

于 2012-08-22T00:55:37.723 回答