Rox*_*Rox 8 java synchronization double-checked-locking
我有一个关于双重检查锁定的问题.考虑这个例子:
public class Singleton {
private static volatile Singleton instance = null;
public static Singleton getInstance() {
if(instance == null) {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance ;
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,上面的代码是制作Singleton类的正确方法.
但是,NetBeans要我删除外部if语句,所以它看起来像这样:
public class Singleton {
private static volatile Singleton instance = null;
public static Singleton getInstance() {
synchronized(Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
return instance ;
}
}
Run Code Online (Sandbox Code Playgroud)
这两个片段之间的唯一区别在于,在第二个示例中,代码将始终进入同步块,而第一个则不会.为什么我会听NetBeans并删除外部if语句?应该更好地避免锁定.
NetBeans 的自动提示系统显然不知道可以volatile像您所做的那样使用 正确执行双重检查锁定,因此它建议改为完全锁定。安全总比后悔好。但在这种情况下,您是对的,而不是 NetBeans。