java - 多线程单例

标签 java multithreading

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

相关文章:

java - MVC 和 Java-EE

Java运行和停止线程

c# - WPF MVVMLight Messenger UI 线程问题

c# - 如何知道创建的线程数并相应地限制任务

java - Quasar Fiber 相当于 Java 的 ThreadPoolExecutor?

java - 如何管理Java中的依赖关系

java - 如何从 Firebase 检索具有 2 层结构的数据?

java - 推送通知在 Android 中不起作用,代号一

java - 带有返回类型和输入参数的Execute方法

Java 8 - 获取列表元素的 'parent' 对象