在实施Singleton模式时,有人可以解释一下之间的区别:
同步静态方法:
public static synchronized Singleton getInstance() {
if(instance==null){
instance = new Singleton();
}
return instance;
}
静态方法中的和同步块:
public static Singleton getInstance() {
if(instance==null){
synchronized(Singleton.class){
if(instance==null){
instance = new Singleton();
}
}
}
return instance;
}
为什么我们必须在第二种方法中检查instance==null
两次,第二种方法优于第一种方法的优势是什么?
答案 0 :(得分:1)
在第二个例子中,由于竞争条件,你必须检查instance==null
两次 - 如果两个线程同时检查这个条件,那么它们都会进一步使用if
语句。然后,只有一个人可以进入关键部分,但如果没有null
再次检查thread2
会覆盖instance
区别在于第一个是coarse grained
同步,第二个是fine grained
: