对单例实现的冲突理解

时间:2015-04-07 04:16:05

标签: java singleton

根据我的理解,Singleton是一个类的单个实例,持续整个应用程序生命周期。但是,我已经看到了系统的一些不同的实现,但我总是被告知他们错了,有缺陷等等。我要发布我看到的两个更常见的是,我希望根据哪种实施更好以及原因来听取意见/事实。实现是可编译的。

实施A:

public class Foo {
   private static Foo singelton;

   private Foo() {
       System.out.println("Bar");
   }

   public static Foo getSingleton() {
       if(singleton == null) singleton = new Foo();
       return singleton;
   }

   public static void main(String[] args) { 
       Foo.getSingleton();
   }
}

实施B:

public class Foo {
   private static final Foo singelton = new Foo();

   private Foo() {
       if(singelton != null) {
           throw new IllegalStateException("Singleton class was already constructed.");
       }
       System.out.println("Bar");
   }

   public static void main(String[] args) {
       // NOT REQUIRED
   }

}

您会在实施B 中注意到Singleton实例是最终的。此外,由于静态实现,main(String[])方法永远不需要构造此类的实例。

实施A和B都会产生相同的结果。

评论

1 个答案:

答案 0 :(得分:1)

嘿,你已经展示了两个实现,第二个被称为早期初始化,第一个被称为延迟初始化,因为它只是按需初始化类。 但是,您的第一次初始化将在多线程环境中失败。 您必须使用双重检查锁定来保护您的代码。 E. g。 :

public class EagerSingleton {
    private static volatile EagerSingleton instance = null;

    // private constructor
    private EagerSingleton() {
    }

    public static EagerSingleton getInstance() {
        if (instance == null) {
            synchronized (EagerSingleton.class) {
                // Double check
                if (instance == null) {
                    instance = new EagerSingleton();
                }
            }
        }
        return instance;
    }
}

有关更多详情,请查看: http://howtodoinjava.com/2012/10/22/singleton-design-pattern-in-java/