gpt4 book ai didi

java - 多线程单例

转载 作者:行者123 更新时间:2023-12-03 12:48:06 25 4
gpt4 key购买 nike

我已经阅读了很多在 Java 中为多线程环境创建单例的可能方法,如枚举、双重检查锁定等

我找到了一个简单的方法,也可以正常工作,但我找不到它的缺点或失败案例。任何人都可以解释它何时会失败或为什么我们不应该选择这种方法。

public final class MySingleton {
public final static MySingleton INSTANCE = new MySingleton();
private MySingleton(){}
}

我正在使用以下代码对其进行测试并且工作正常:

public class MyThread {
public static void main(String[] args) {

for (int i = 0; i < 10000; i++) {
Thread thread = new Thread(() -> {
MySingleton singleton = MySingleton.INSTANCE;
System.out.println(singleton.hashCode() + " " + Thread.currentThread().getName());
});
thread.start();
}
}
}

感谢每条评论。

最佳答案

你的单例在加载类时被实例化,因此当 main 方法启动时,它已经被实例化并且从多线程的角度来看是安全的。

但是有一些争论为什么这可能不是最好的方法:

  • 当实例化你的单例抛出异常时,你会得到一个难以分析的讨厌的类加载异常,尤其是当你没有要附加的调试器时。
  • 实例化需要一些时间,因此您可能不想在加载类时执行此操作,以最大程度地减少应用程序的启动时间

此外,使用单例也不是一个好的设计,因为您硬编码了客户端(使用此类)与此类的实现之间的依赖关系。因此很难用用于测试的模拟替换您的实现。

关于java - 多线程单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65882352/

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