Singleton design pattern
spring IOC容器中的bean, spring boot中controller、service、dao层中通过@Autowire依赖注入的对象都是单例模式
- 构造函数私有化
- 对外提供获取单例对象的方法
分类
- 懒汉:线程安全方式懒加载,需要使用时再创建对象
public class SingletonLazy {
// volatile:java关键字,禁止指令重排
private static volatile SingletonLazy instance;
/**
* 构造函数私有化
*/
private SingletonLazy(){}
/**
* 第四种方式 对外暴露应该方法获取类的对象
* 最优方案
* DCL 双重检查锁定 (Double-Checked-Locking):在多线程下保持高性能
*/
public static SingletonLazy getInstance3(){
if(instance == null) // 第一重检查
synchronized(SingletonLazy.class){ // 加锁,线程安全
if(instance == null){ // 第二重检查
instance = new SingletonLazy();
}
}
return instance;
}
}
- 饿汉:提前创建好对象
简单方便不存在线程安全问题,会一直占用空间
public class SingletonHungry {
private static SingletonHungry instance = new SingletonHungry();
private SingletonHungry(){}
public static SingletonHungry getInstance(){
return instance;
}
}