根据我的理解,无状态EJB线程安全来自于事实 对同一个SLSB的并发请求将由该特定bean的不同内容提供,每个请求都有自己的实例变量。
例如,如果无状态ejb具有实例变量,例如int计数器, 每个池化的EJB将使用不同的计数器变量。
同样适用于注入变量,如下例所示:
@Stateless
public class User implements UserHomeLocal, UserHomeRemote
{
@PersistenceContext(name="J2EE")
private EntityManager manager;
}
更一般地说:是否有任何情况下池化bean可以通过依赖注入来共享实例变量?
答案 0 :(得分:0)
EJB Spec说
容器序列化对每个有状态和无状态会话的调用 bean实例。大多数容器都支持a的许多实例 会话bean并发执行;但是,每个实例只能看到 方法调用的序列化序列。因此,有状态或 无状态会话bean不必编码为可重入
这意味着默认情况下它是线程安全的。无需额外的努力。同时注意到无状态bean应该是“无状态”。
无状态bean具有可变状态并不是一个好主意。这只是灾难的秘诀。如果需要在所有实例之间共享变量,则需要将其作为静态变量。 EJB规范restricts使用静态可变变量(类计数变量,如计数器,用于跟踪对所有实例的所有请求)。基本上“读取或写入非最终静态字段”受到限制。
因此,为了使池化的bean共享一个实例变量,该变量应该是静态的,最终的。如果您出于任何实施原因查看此内容,可以查看Singleton beans。创建单例bean后,可以将其注入会话bean。但我不确定这是否值得痛苦。
是的,实体管理器或任何此类Java EE对象(例如对Java持久性实体管理器或有状态会话bean的引用)将被共享并保证默认情况下是线程安全的(在无状态下)