保证在j2ee中是线程安全的

时间:2017-09-04 12:28:40

标签: multithreading java-ee glassfish ejb ejb-3.1

我在j2ee中使用它的设计模式:

public class myClass{
  private static Hashtable<Integer, ContentClass> contents = new Hashtable<Integer, ContentClass>();
public synchronized static void m1(){
//some work on contents

}
public synchronized static void m2(){
//another some work on contents

}

我想在运行glassfish的3台服务器中部署它。

测验1:是否保证线程安全?

测验2:如果类更改为有状态EJB发生了什么?它是线程安全的吗?

1 个答案:

答案 0 :(得分:1)

如果要在运行glashfish的三个服务器之间共享bean,则需要将EJB持久性与实体bean一起使用,而不是使用无状态会话bean 。但EJB持久性不适用于静态成员。

因此,你应该写:

public class myClass{
  private Hashtable<Integer, ContentClass> contents = new Hashtable<Integer, ContentClass>();
  public synchronized void m1(){
//some work on contents

}
public synchronized void m2(){
  //another some work on contents
}

并添加注释或其他方法来解释容器如何使用某种映射来持久化contents

这样,您可以将此实体bean持久保存到共享数据源,并且三台服务器将能够正确访问它。因此,您需要定义数据源,持久性单元和实体管理器来管理这个bean的实例。

这样,您的代码将是线程安全的。正确完成访问contents