EJB实例变量线程安全性



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

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

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

@Stateless
public class User implements UserHomeLocal, UserHomeRemote
{
    @PersistenceContext(name="J2EE")
    private EntityManager manager;
}

更普遍地说:池化bean是否可以作为依赖注入的结果共享实例变量?

EJB规范表示

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

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

无状态bean具有可变状态不是一个好主意。这只会导致灾难。如果您需要在所有实例之间共享一个变量,那么它必须是一个静态变量。EJB规范限制使用静态可变变量(类级变量,如跟踪所有实例的所有请求的计数器)。基本上"读取或写入非最终静态字段"是受限制的。

因此,要使池化bean共享一个实例变量,该变量应该是静态的和最终的。如果您出于任何实现原因查找这个,您可以查看Singleton bean。一旦创建了一个singleton bean,就可以将其注入到会话bean中。但我不确定这种痛苦是否值得。

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

最新更新