-1

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

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

null check但是有没有一种方法可以通过在从静态函数中获取对象之前每个线程必须支付的惩罚来提高类的性能?

4

3 回答 3

3

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

只有在您确定确实存在真正的问题后才担心性能。然后,做一些分析来识别导致问题的代码部分,不要优化那些“看起来”像它们可能是问题的东西,而没有性能统计数据来支持这种看法。

于 2016-04-01T18:58:22.807 回答
2

根据乔什·布洛赫的说法。从 Java 1.5 开始有效的 Java 第二版,这是最好的方法

public enum Singelton {
  INSTANCE;
}

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

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

所以我建议三思而后行是否需要 Singleton,我总是避免使用它们。

于 2016-04-01T19:06:11.080 回答
0

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

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

   public static Singlegon getInstance()
   {
      return _instance;
   }
 }
于 2016-04-01T19:06:45.807 回答