我已经阅读了很多在 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/