单例设计模式
singleton
模式定义:
保证一个类只有一个实例,并且提供一个全局访问点。
场景:
重量级的对象,不需要多个实例,如:线程池,数据库连接池。
类图 |
---|
Singleton |
- singleton : Singleton |
- Singleton() |
+getInstance(): Singleton |
知识点
- 模式定义/应用场景/类图分析;
- 字节码知识/字节码指令重排;
- 类加载机制;
- JVM序列化机制;
- 单例模式子啊spring框架和JDK源码中的应用;
懒汉模式
定义:延迟加载,只有在真正使用的时候,才开始加载。
1)线程安全问题
2)double check 加锁优化
3)编译器(JIT),CPU有可能对指令进行重排序,导致使用到尚未初始化的实例,可以通过添加volatile关键字进行修饰,对于volatile修饰的字段,可以防止指令重排。
编码:
class LazySingleton {
private volatile static LazySingleton instance;
private LazySingleton() {
}
public static LazySingleton getInstance() {
if (instance == null) {
synchronized (LazySingleton.class) {
if (instance == null) {
instance=new LazySingleton();
//字节码
//JIT,CPU 指令重排
//1.分配空间
//2.初始化
//3.引用赋值
}
}
}
return instance;
}
饿汉模式
定义:类加载的初始化阶段就完成了实例初始化。本质上是借助于jvm类加载机制,保证实例的唯一性。
类加载过程:
1)加载二进制数据到内存中,生成对应的class数据结构
2)连接:a.验证,b.准备(给类的静态成员变量赋默认值),c.解析
3.初始化:给类的静态变量赋初值
class HungrySingleton {
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
}
public static HungrySingleton getInstance() {
return instance;
}