gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:59:31 27 4
gpt4 key购买 nike

我正在学习设计模式,并且在 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 (例如当前实例)。但是这个方法是static ,所以没有实例,只有一个类。因此,我们对此进行同步。
synchronizing的原因|方法的这一部分是两个线程不会同时创建两个实例。如果两者都执行 firstInstance == null,则可能会发生这种情况。同时检查,发现都是true ,两者都决定创建一个新实例。这给了我们两个 Singleton 的实例。课,这显然很糟糕。

此外,我认为您在调用 synchronized 时会感到困惑。一个 access modifier .

唯一的访问修饰符是 private , public , 和 protected (加上隐藏的默认)。
Synchronizednon-access modifier .单个方法可以同时具有访问和非访问修饰符,例如 public staticprivate synchronized .

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

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

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