单例模式使用的场景:需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多(即:重量级对象),但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象(比如数据源、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 就是典型的饿汉式单例