例:org.springframework.beans.factory.support.DefaultSingletonBeanRegistry
核心奥义:相同条件下,最多只存在一个实例,每次使用时进行获取,获取不到时进行实例化,同一时间只允许一个线程进行实例化
延迟实例化
使用同步锁保障线程安全,同时可以使用volatile保证线程通信(数据同步)
缺点:第一次实例化时,线程需要等待,如果同时有多个请求,可能造成短暂拥堵
优点:第一次使用时才进行实例化,节省启动资源占用
急切实例化
在项目启动时进行实例化,由JVM保障实例唯一性
缺点:如果实例在项目启动后很长一段时间闲置,会造成资源浪费
优点:代码逻辑简单,符合大部分应用场景
public class Singleton {
private volatile static Singleton uniqueInstance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return uniqueInstance;
}
内部类
综合以上两种方式
类定义数据是存放在方法区的,静态常量是存放在方法区的运行时常量池中
缺点:内部类的潜在风险是方法区溢出,经常使用内部类,会忽视类的数量
优点:一开始不实例化,不浪费不必要的资源;内部类借助JVM保障了实例的唯一性
public class SingletonIniti {
private SingletonIniti() {
}
private static class SingletonHolder {
private static final SingletonIniti INSTANCE = newSingletonIniti();
}
public static SingletonIniti getInstance() {
return SingletonHolder.INSTANCE;
}
}