假设我有这两个单例实现:
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关键字有区别吗?
答案 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