双重检查锁定,NetBeans让我感到困惑?

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语句?应该更好地避免锁定.

Joo*_*kka 3

NetBeans 的自动提示系统显然不知道可以volatile像您所做的那样使用 正确执行双重检查锁定,因此它建议改为完全锁定。安全总比后悔好。但在这种情况下,您是对的,而不是 NetBeans。

  • 实际上,如果代码在 5.0 之前的 JVM 上运行,NetBeans 是正确的。 (2认同)
  • @Stephen C 但即使是 1.5 也已经在不久前结束了其使用寿命。甚至 Sun 1.4 实现也支持 1.5 JMM。除非您的目标是 Java ME,否则这是不对的。 (2认同)