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

How to get ride of Null check in singleton design pattern in Java for better performance

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

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;
    }
}

但是有没有一种方法可以提高 class 的性能,方法是在从静态函数获取对象之前,每个线程在执行 null check 时都必须付出代价?

这称为过早优化。您实际上 不知道 空检查导致了问题(它不是,相信我)。空检查的成本在纳秒级。

只有在确定确实存在真正的问题后才担心性能。然后,进行一些分析以确定导致问题的代码部分,不要优化 "look" 没有性能统计数据支持这种看法的问题。

根据乔什·布洛赫的说法。自 Java 1.5 以来的第二版有效 Java 这是最好的方法

public enum Singelton {
  INSTANCE;
}

即使面对复杂的序列化或反射攻击也是安全的。

但请始终记住,单身人士捍卫可测试性。 虽然可以使用反射重置您问题中的 Singleton 以用于测试目的,但我的答案中的 Singleton 可能不能。

所以我建议三思是否需要单例,我总是避免它们。

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

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

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