我在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发生了什么?它是线程安全的吗?
答案 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
。