java—这两种单例实现之间的区别是什么?

rnmwe5a2  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(482)

这个问题在这里已经有答案了

使用同步方法而不是同步块是否有好处(23个答案)
一年前关门了。
假设我有两个单例实现:
1)

class Singleton {
    private static Singleton singleton;

    private Singleton(){}

    public static synchronized Singleton getInstance() {
            if(singleton == null ){ singleton = new Singleton(); }
        return this.singleton;
    }
}
class Singleton {
    private static Singleton singleton;

    private Singleton(){}

    public static Singleton getInstance(){
        synchronized(Singleton.class){
            if(singleton == null ){ singleton = new Singleton(); }
        }
        return this.singleton;
    }
}

它们之间有什么区别?换句话说,对于这种情况,在方法上使用synchronized块和使用synchronized关键字有区别吗?

eoxn13cs

eoxn13cs1#

同步方法提供了一种简单的策略来防止线程干扰和内存一致性错误:如果一个对象对多个线程可见,则对该对象变量的所有读写都通过同步方法完成。
同步方法

public Synchronized void foo() {
...
}

java中的同步块是在某个对象上同步的。只有一个线程可以同时执行其中的代码。所有其他试图进入同步块的线程都将被阻止,直到同步块中的线程退出该块。
同步块

private Object lock = new Object();

public void foo() {
synchronized(lock) {
...
}
}

https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

相关问题