Java单例模式复习(三)
心血来潮,在学学单例模式,以下是代码块:
package singleton;
public class SingletonStatic {
private SingletonStatic() {
System.out.println("static SingletonStatic is create");
}
private static class SingletonHander {
private static SingletonStatic instance = new SingletonStatic();
}
public static SingletonStatic getInstance() {
return SingletonHander.instance;
}
}
注释:
- 当
SingletonStatic
被加载的时候,起内部类不会被初始化,所以当SingletonStatic
类被载入JVM时,不会初始化单例类, - 而当
getInstance()
方法被调用时,才会加载SingletonHander
,而初始化instance
,由于实例的建立是在类加载完成时完成, - 所以对线程友好的,故不需要使用
synchronized
关键字修饰,这中方式兼备了前面两种单例模式存在的问题, - 但是也还有其他情况,可能导致系统产生多个实例,比如通过反射机制,强行调用单例类的私有构造函数,生成多个单例,等