EJB实例变量线程安全性

时间:2015-06-29 15:37:46

标签: java jpa ejb server

根据我的理解,无状态EJB线程安全来自于事实 对同一个SLSB的并发请求将由该特定bean的不同内容提供,每个请求都有自己的实例变量。

例如,如果无状态ejb具有实例变量,例如int计数器, 每个池化的EJB将使用不同的计数器变量。

同样适用于注入变量,如下例所示:

@Stateless
public class User implements UserHomeLocal, UserHomeRemote
{

    @PersistenceContext(name="J2EE")
    private EntityManager manager;
}

更一般地说:是否有任何情况下池化bean可以通过依赖注入来共享实例变量?

1 个答案:

答案 0 :(得分:0)

EJB Spec说

  

容器序列化对每个有状态和无状态会话的调用   bean实例。大多数容器都支持a的许多实例   会话bean并发执行;但是,每个实例只能看到   方法调用的序列化序列。因此,有状态或   无状态会话bean不必编码为可重入

这意味着默认情况下它是线程安全的。无需额外的努力。同时注意到无状态bean应该是“无状态”。

无状态bean具有可变状态并不是一个好主意。这只是灾难的秘诀。如果需要在所有实例之间共享变量,则需要将其作为静态变量。 EJB规范restricts使用静态可变变量(类计数变量,如计数器,用于跟踪对所有实例的所有请求)。基本上“读取或写入非最终静态字段”受到限制。

因此,为了使池化的bean共享一个实例变量,该变量应该是静态的,最终的。如果您出于任何实施原因查看此内容,可以查看Singleton beans。创建单例bean后,可以将其注入会话bean。但我不确定这是否值得痛苦。

是的,实体管理器或任何此类Java EE对象(例如对Java持久性实体管理器或有状态会话bean的引用)将被共享并保证默认情况下是线程安全的(在无状态下)