这两个单例实现之间有什么区别?

时间:2019-02-04 14:28:56

标签: java singleton

假设我有这两个单例实现:

1)

class Singleton {
    private static Singleton singleton;

    private Singleton(){}

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

2)

class Singleton {
    private static Singleton singleton;

    private Singleton(){}

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

两者之间有什么区别? 换句话说,在这种情况下,使用同步块和在方法上使用synced关键字有区别吗?

1 个答案:

答案 0 :(得分:2)

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

同步方法

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