我的一个Java EE Bean中的“线程安全”方法调用有关使用Lucene IndexWriter
的问题。
我不确定是否应该通过实现 Singleton Pattern 来解决我的问题,或者是否足以将关键字synchronized
添加到我的bean方法中。
有人可以解释一下究竟有什么区别吗?
答案 0 :(得分:2)
Singleton只创建一个类的实例。只要它本身没有引用。
作为非线程安全方法的示例:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static Singleton getInstance () {
if (Singleton.instance == null) {
Singleton.instance = new Singleton ();
}
return Singleton.instance;
}
}
这个问题是:如果多个线程第一次同时执行getInstance,则会多次调用Singleton
的构造函数。因此,单身人士不会是单身人士,后续的错误很难被发现。
线程安全方法的示例:
public class Singleton {
private static Singleton instance;
private Singleton () {}
public static synchronized Singleton getInstance () {
if (Singleton.instance == null) {
Singleton.instance = new Singleton ();
}
return Singleton.instance;
}
}
这个方法的坏处是,对于每次访问,调用getInstance
方法(因此一个线程可以阻止其他方法)。
最后但并非最不重要的是同步版本:
public class Singleton {
private static final class InstanceHolder {
static final Singleton INSTANCE = new Singleton();
}
private Singleton () {}
public static Singleton getInstance () {
return InstanceHolder.INSTANCE;
}
}
类变量的初始化由类加载器隐式同步。通过使用内部类Singleton-Constructor,它只在getInstance
方法中初始化内部类时调用。
我希望这会对你有所帮助。如果您需要更多信息,请发表评论,抱歉我的英语不好。
答案 1 :(得分:0)
单例模式是跨越jvm或应用程序实例的一个对象概念,而synchronized是java中用于互斥的关键字。请详细说明你的问题。