如何在Java的单例设计模式中使用空检查以获得更好的性能

如何在Java的单例设计模式中使用空检查以获得更好的性能,java,multithreading,singleton,null-check,Java,Multithreading,Singleton,Null Check,为了确保在多线程环境中只创建一个类实例,我们创建了一个具有以下结构的单例类 class Singleton { private volatile static Singleton _instance; private Singleton() { // preventing Singleton object instantiation from outside } public static Singleton getInstanceDC()

为了确保在多线程环境中只创建一个类实例,我们创建了一个具有以下结构的单例类

class Singleton {

    private volatile static Singleton _instance;

    private Singleton() {
        // preventing Singleton object instantiation from outside
    }

    public static Singleton getInstanceDC() {
        if (_instance == null) {
            synchronized (Singleton.class) {
                if (_instance == null) {
                    _instance = new Singleton();
                }
            }
        }
        return _instance;
    }
}

但是,有没有一种方法可以提高类的性能,即在从静态函数中获取对象之前,在执行
空检查时,每个线程必须支付的惩罚?

这就是所谓的过早优化。您实际上并不知道空检查导致了问题(相信我,事实并非如此)。空检查的成本约为纳秒


只有在发现确实存在问题之后,才需要担心性能。然后,进行一些分析,以确定导致问题的代码部分,不要优化那些“看起来”可能是问题的东西,因为没有性能统计数据来支持这种看法。

根据Josh Bloch的说法。有效的Java第二版,自Java1.5以来,这是最好的方法

public enum Singelton {
  INSTANCE;
}
即使在复杂的序列化或反射攻击中,它也是安全的

但始终要记住,单身汉捍卫可测试性。 虽然您的问题中的单例可以使用反射重置为测试目的,但我的答案中的单例可能无法重置


因此,我建议您仔细考虑是否需要单例,我总是避免使用它们。

单例的最佳方法是尽早实例化,除非有资源限制的原因

public class Singleton
{
   //guaranteed thread safe
   private static final Singleton _instance = new Singleton();

   public static Singlegon getInstance()
   {
      return _instance;
   }
 }

空检查非常便宜。这不是我会担心优化的问题,即使有可能优化,我对此表示怀疑。特别是,CPU在优化几乎总是以相同方式进行的if检查方面非常出色,而这一次将是如此。这基本上是免费的,你真的应该找点别的事来担心。难道你不能静态初始化
\u实例
,而不是在第一次访问时创建它吗?这样,您就不需要在每次访问时检查null。请参阅有效的Java第二版Thank@Jim,即使我知道同样的事情,它也不会影响性能。但这是一位非常资深的开发人员在采访中提出的问题之一,我无法回答。