![](/img/trans.png)
[英]What is the difference between Singleton Design Pattern and Singleton Object In Java?
[英]What is the difference between Singleton Pattern and Synchronized
我的一个Java EE Bean中的“线程安全”方法调用存在有关使用Lucene IndexWriter
。
我不确定是否应该通过实现单例模式来解决我的问题,或者将synchronized
关键字添加到我的bean方法是否足够。
谁能解释到底有什么区别?
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
方法中的初始化期间调用它。
我希望这可以帮助你。 对不起,我的英语不好,如果您需要更多信息,请发表评论。
单例模式是跨jvm或应用程序实例的一个对象概念,而synced是java中用于相互排斥的关键字。 请详细说明您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.