1. 什么是单例模式?
确保某一个类只有一个实例,而且自行实例化,向整个系统提供这个实例。
2. 单例模式所具备的特征?
- 构造方法不对外开放的,一般是private
- 通过静态方法或者枚举返回的对象实例
- 注意多线程的场景
- 注意单例实例在反序列化时不会重新创建对象
3. 懒汉式单例描述
- 私有的静态变量
- 私有的构造方法
- 同步锁力度太大(通过双重校验DCL进行优化)
//懒汉式单例模式
public static class Singleton {
private static Singleton mInstance;
public static synchronized Singleton getInstance() {
if (mInstance == null) {
mInstance = new Singleton();
}
return mInstance;
}
}
//双重校验DCL
public static class Singleton1 {
private volatile static Singleton1 mInstance=null;
public Singleton1(){}
public static synchronized Singleton1 getInstance() {
if (mInstance == null) {
synchronized (Singleton1.class) {
if (mInstance == null) {
mInstance = new Singleton1();
//1. mInstance实例分配对象
//2. 调用Singletion1构造方法 初始化成员字段
//3. Singleton1对象赋值给Singleton1
// jdk 乱序 DCL失效 考点
// 修复方法 添加volatile
}
}
}
return mInstance;
}
}
4. 饿汉式单例描述
- 线程安全
//饿汉式单例模式
public static class Singleton2 {
private static Singleton2 mInstance = new Singleton2();
public static Singleton2 getInstance() {
return mInstance;
}
}
5. 静态内部类单例
//静态内部类单例(线程安全)
public static class Singleton3 {
private static class Holder {
private static final Singleton3 SINGLETON = new Singleton3();
}
public static Singleton3 getInstance() {//延迟加载
return Holder.SINGLETON;
}
}