单例模式
概念:通俗来说,就是一个类只有一个实例。
场景:对共享资源的占用,例如打印机,可以有多个打印任务,但只有一个打印任务可以占用打印机。
实现:通过私有化构造方法,使该类只能在内部实例化。
1. 懒汉模式,在调用该方法的时候实例化对象。(线程安全,但存在线程同步的性能开销):
public class Singleton {
private static Singleton instance;
private Singleton(){}
public static synchronized Singleton Singleton(){
if(instance == null){
instance = new Singleton();
System.out.println(Thread.currentThread().getId());
}
return instance;
}
}
2. 饿汉模式,通过静态变量在类加载的时候实例化对象。(类初始化的时候实例对象,线程安全)
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
同时复习一下类的加载顺序:
如果类还没有被加载:
1、先执行父类的静态代码块和静态变量初始化,并且静态代码块和静态变量的执行顺序只跟代码中出现的顺序有关。
2、执行子类的静态代码块和静态变量初始化。
3、执行父类的实例变量初始化
4、执行父类的构造函数
5、执行子类的实例变量初始化
6、执行子类的构造函数
如果类已经被加载:
则静态代码块和静态变量就不用重复执行,再创建类对象时,只执行与实例相关的变量初始化和构造方法。
浙公网安备 33010602011771号