EJB 3中的类变量是线程安全的吗?

时间:2011-11-05 16:13:22

标签: java thread-safety ejb

在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,它应该是线程安全的吗?

1 个答案:

答案 0 :(得分:2)

容器必须只允许特定EJB实例中的一个线程,因此:每个方法只能由一个线程执行,并且您的变量是“安全的”(当您在构造函数或@PostConstruct方法中初始化它时)

但是,SLSB(无状态EJB)应用于保持状态。 EJB已合并,因此您无法保证将返回到同一实例。 SFSB就是为此目的而制作的。

EntityManager作为EJB中的每个实例字段都是线程安全的。

但是,EntityManager本身线程安全,不能在多于1个线程可以访问它的环境中使用(即在Servlet中)。在这种情况下,应该使用EntityManagerFactory