java - 单例设计模式中的 Synchronized(MyClass.class){ } - 它有什么作用?

标签 java multithreading design-patterns syntax synchronized

我正在学习设计模式,并且拥有 Java 中级经验。我正在尝试实现单例设计模式,并在方法中遇到以下代码:

    public static Singleton getInstance(){

    if( firstInstance == null ){
        if (firstThread){
            firstThread = false;
            Thread.currentThread();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
                Logger.getLogger(Singleton.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        synchronized(Singleton.class){

            if(firstInstance == null){
                firstInstance = new Singleton();
            }

        }


    }

    return firstInstance;
}

我了解该方法的工作原理,但我对该代码的一个特定部分有疑问:

        synchronized(Singleton.class){

            if(firstInstance == null){
                firstInstance = new Singleton();
            }
        }

我知道同步块(synchronized block)仅强制同步这部分代码,这使得实现线程安全并且不会减慢整个方法的速度,但为什么我们要包装 Singleton.class 在访问修饰符之前的括号中 synchronized?

我的问题更多的是与 Java 相关,而不是与设计模式相关。我尝试搜索 Google 和 StackOverflow,但我不确定这实际上叫什么,这限制了我的结果。

希望大家能帮帮我。

提前致谢!

最佳答案

因为在 Java 中同步的正常内容是 this (例如当前实例)。但这个方法是静态的,所以没有实例,只是一个类。因此我们对此进行同步。

同步这部分方法的原因是两个线程不会同时创建两个实例。如果两者同时执行 firstInstance == null 检查,并且在发现它为 true 后,都决定创建一个新实例,则可能会发生这种情况。这给了我们两个 Singleton 类的实例,这显然是非常糟糕的。

此外,我认为当您将 synchronized 称为 access modifier 时,您会感到困惑.

唯一的访问修饰符是 privatepublicprotected(加上隐藏的默认访问修饰符)。

同步non-access modifier 。单个方法可以同时具有访问和非访问修饰符,例如 public staticprivate synchronized

请注意,只有synchronizedstatic 可以有 block 。然而,这更多是因为它们的用途而不是它们的修饰符分类。

关于java - 单例设计模式中的 Synchronized(MyClass.class){ } - 它有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43906346/

相关文章:

java - builder 模式中的逻辑

android - 针对不同屏幕尺寸的 Android 设计

java - jexcel API 中的 IndexOutOfBoundsException

c++ - 使用互斥量的正确方法

c - 在多线程生产者和消费者应用程序中读取时发生访问冲突

c++ - 我想让线程的执行顺序依次执行

design-patterns - 你怎么称呼这种设计?

java - JSON 简单的意外字符?

java - 从数据库检索数据并使用 JcomboBox 显示

java - 如何判断当前 bash 脚本是否被调用脚本调用