【发布时间】:2013-06-13 17:32:14
【问题描述】:
我开始习惯 Java 中的关键字static 和volatile。关于我正在构建的单例类,为什么我会看到以下设计?
public class Singleton{
private static volatile Singleton _instance;
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
而不是这个?
public class Singleton{
private static volatile Singleton _instance = new Singleton();
public static Singleton getInstance(){
return _instance;
}
}
第一个设计比第二个设计有什么优势吗?我能看到的唯一优点是第二种设计同步了整个方法,这可能需要阻塞整个方法。但我对此的反面想法是,该方法只有一行,根本不会明显阻塞,对吧?
【问题讨论】:
-
“明显阻塞”是什么意思?仅仅因为我们无法注意到汇编语言的指令时间并不意味着它们在现实生活中并不重要。
-
我很确定第一个示例不需要对 null _instance 进行两次检查。因此可以删除第二次检查。在此类中,实例无法从 new'd 变为 null。
-
@user619818 第二次检查是必要的,因为自上次检查以来另一个线程可能已经初始化了实例。
-
啊,如果你得到线程之间的上下文切换。好的。
-
@DaveNewton 当我说“明显阻塞”时,我的意思是从每个设计中调用每个 getInstance() 方法所需的时间没有区别。
标签: java static synchronization singleton volatile