在servlet中,因为除了工具SingleThreadModel
之外它是单例。参考这篇文章https://www.fortify.com/vulncat/en/vulncat/java/singleton_member_field_race_condition.html
但是在EJB 3中,我找不到类似的文档。并且因为容器将创建一个池来处理EJB。我认为类变量应该是安全的,它是否正确?
例如,classVar1
是一个类变量,我在构造函数中初始化它,稍后再使用它。在servlet中,它可能有问题,但在EJB 3中,它应该没问题,对吧?
@Stateles
public class HelloBean implements Hello {
ObjectXXX classVar1;
public HelloBean() {
ObjectXXX classVar1 = new ObjectXXX();
}
public String doHello(String message) {
return message + classVar1.method1();
}
}
另一个问题是资源(即JPA中的EntityManager
)注入EJB,它应该是线程安全的吗?
答案 0 :(得分:2)
容器必须只允许特定EJB实例中的一个线程,因此:每个方法只能由一个线程执行,并且您的变量是“安全的”(当您在构造函数或@PostConstruct
方法中初始化它时)
但是,SLSB(无状态EJB)应不用于保持状态。 EJB已合并,因此您无法保证将返回到同一实例。 SFSB就是为此目的而制作的。
EntityManager作为EJB中的每个实例字段都是线程安全的。
但是,EntityManager本身不线程安全,不能在多于1个线程可以访问它的环境中使用(即在Servlet中)。在这种情况下,应该使用EntityManagerFactory
。