对单例实现的相互矛盾的理解
Conflicting understanding on singleton implementations
根据我的理解,单例是 class 的单个实例,它持续整个应用程序生命周期。然而,我已经看到了一些不同的系统实现,但我总是被告知它们是错误的、有缺陷的等等。我将 post 我更常见的两个,我想听听 opinions/fact 基于哪个实施更好以及为什么。实现是可编译的。
实现A:
public class Foo {
private static Foo singelton;
private Foo() {
System.out.println("Bar");
}
public static Foo getSingleton() {
if(singleton == null) singleton = new Foo();
return singleton;
}
public static void main(String[] args) {
Foo.getSingleton();
}
}
实现 B:
public class Foo {
private static final Foo singelton = new Foo();
private Foo() {
if(singelton != null) {
throw new IllegalStateException("Singleton class was already constructed.");
}
System.out.println("Bar");
}
public static void main(String[] args) {
// NOT REQUIRED
}
}
您会在实现 B 中注意到 Singleton 实例是最终的。此外,由于静态实现,main(String[])
方法永远不需要构造此 class.
的实例
实现 A 和 B 将产生相同的结果。
意见?
嘿,你展示了两个实现,第二个称为早期初始化,第一个称为延迟初始化,因为它仅按需初始化 class。
但是,您的第一次初始化在多线程环境中会失败。
您必须使用双重检查锁定来保护您的代码。
例如:
public class EagerSingleton {
private static volatile EagerSingleton instance = null;
// private constructor
private EagerSingleton() {
}
public static EagerSingleton getInstance() {
if (instance == null) {
synchronized (EagerSingleton.class) {
// Double check
if (instance == null) {
instance = new EagerSingleton();
}
}
}
return instance;
}
}
更多详情请查看:
http://howtodoinjava.com/2012/10/22/singleton-design-pattern-in-java/
根据我的理解,单例是 class 的单个实例,它持续整个应用程序生命周期。然而,我已经看到了一些不同的系统实现,但我总是被告知它们是错误的、有缺陷的等等。我将 post 我更常见的两个,我想听听 opinions/fact 基于哪个实施更好以及为什么。实现是可编译的。
实现A:
public class Foo {
private static Foo singelton;
private Foo() {
System.out.println("Bar");
}
public static Foo getSingleton() {
if(singleton == null) singleton = new Foo();
return singleton;
}
public static void main(String[] args) {
Foo.getSingleton();
}
}
实现 B:
public class Foo {
private static final Foo singelton = new Foo();
private Foo() {
if(singelton != null) {
throw new IllegalStateException("Singleton class was already constructed.");
}
System.out.println("Bar");
}
public static void main(String[] args) {
// NOT REQUIRED
}
}
您会在实现 B 中注意到 Singleton 实例是最终的。此外,由于静态实现,main(String[])
方法永远不需要构造此 class.
实现 A 和 B 将产生相同的结果。
意见?
嘿,你展示了两个实现,第二个称为早期初始化,第一个称为延迟初始化,因为它仅按需初始化 class。 但是,您的第一次初始化在多线程环境中会失败。 您必须使用双重检查锁定来保护您的代码。 例如:
public class EagerSingleton {
private static volatile EagerSingleton instance = null;
// private constructor
private EagerSingleton() {
}
public static EagerSingleton getInstance() {
if (instance == null) {
synchronized (EagerSingleton.class) {
// Double check
if (instance == null) {
instance = new EagerSingleton();
}
}
}
return instance;
}
}
更多详情请查看: http://howtodoinjava.com/2012/10/22/singleton-design-pattern-in-java/