单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、session工厂等)
1. 饿汉式(静态常量)
缺点:可能造成内存浪费
- 构造器私有化
- 类静态成员变量
- 暴露静态公共方法 getInstance
2. 懒汉式(双重检验)
- 构造器私有
- 静态 volatile 成员变量
- 双重 if+synchronized
public class Singleton {
//构造器私有
private Singleton() {
}
private static volatile Singleton instance;
//双重检查
public static Singleton getInstance() {
if(instance == null) {
synchronized (Singleton.class) {
if(instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
3. JDK 源码分析
java.lang.Runtime 就是典型的饿汉式单例