gpt4 book ai didi

java - 对单例实现的理解存在冲突

转载 作者:行者123 更新时间:2023-12-01 11:41:34 25 4
gpt4 key购买 nike

根据我的理解,单例是一个类的单个实例,它在应用程序的整个生命周期中持续存在。然而,我见过一些不同的系统实现,但我总是被告知它们是错误的、有缺陷的等等。我将发布我更常见的两个,我想听听基于哪种实现更好以及原因的意见/事实。实现是可编译的。

实现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[]) 方法永远不需要构造此类的实例。

实现 A 和 B 都会产生相同的结果。

意见?

最佳答案

嘿,您已经展示了两种实现,第二个称为早期初始化,第一个称为延迟初始化,因为它仅按需初始化类。但是,在多线程环境中,您的第一次初始化将失败。您必须使用双重检查锁定来保护您的代码。例如:

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/

关于java - 对单例实现的理解存在冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29483654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com