[讨论]线程安全的单例模式

jasonliu
oscar 2016-11-22 字数 629

1.   private Singleton() {

}

private static class HolderClass {

private final static Singleton instance = new Singleton();

}

public static Singleton getInstance() {

return HolderClass.instance;

}

2. private static final EagerSingleton instance = new EagerSingleton();

private EagerSingleton() { }

public static EagerSingleton getInstance() {

return instance;

}

一般文章都说方法1好,启动时间较快?不太明白好在哪?当调用 Singleton s1 = Singleton.getInstance(); 两种调用都是同时初始化,不调用的情况下,方法2的instance也不会初始化啊?这个和jvm加载是否有关系呢?

Java Java技术
3 个回复
zms
小美 2016-11-22

区别确实不大。

一点区别是:  方法二在 单例类 初始化的时候 instance就会new出来; 方法一在单例类初始化的时候,instance不会new出来。

一般发生的情况在  你得单例类 还有其它  static的工具方法,有人不调用 getInstance 只调用这些方法时。

【 在 jasonliu (oscar) 的大作中提到: 】

: 1.   private Singleton() {

:     }

:     private static class HolderClass {

: ...................

jasonliu
oscar 2016-11-22

既然是单例,一般写法都是通过getInstance掉吧,不通过的话应该算代码风格问题吧。

【 在 zms 的大作中提到: 】

: 区别确实不大。

: 一点区别是:  方法二在 单例类 初始化的时候 instance就会new出来; 方法一在单例类初始化的时候,instance不会new出来。

: 一般发生的情况在  你得单例类 还有其它  static的工具方法,有人不调用 getInstance 只调用这些方法时。

: ...................

zms
小美 2016-11-22

我是说其它情形,比方说有个main函数:

public class Singleton {

private Singleton() {

System.out.println("called");

}

private static class HolderClass {

private final static Singleton instance = new Singleton();

}

public static Singleton getInstance() {

return HolderClass.instance;

}

public static int Add(int a, int b) {

return a + b;

}

public static void main(String[] args) {

System.out.println(Add(3, 4));

}

}

main函数或者 Add 执行的时候,单例不会被创建。

【 在 jasonliu (oscar) 的大作中提到: 】

: 既然是单例,一般写法都是通过getInstance掉吧,不通过的话应该算代码风格问题吧。