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