定义与类型
定义:保证一个类仅有一个实例,并提供一个全局访问点
类型:创建型
适用场景
- 想确保任何情况下都绝对只有一个实例
优点
- 在内存里只有一个实例,减少了内存开销
- 可以避免对资源的多重占用
- 设置全局访问点,严格控制访问
缺点
- 没有接口,扩展困难
重点
- 私有构造器
- 线程安全
- 延迟加载
- 序列化和反序列化安全
- 反射
相关设计模式
- 单例模式和工厂模式
- 单例模式和享元模式
代码实现
DoubleCheck双重检查
- 创建LazySingleton类
/**
* @author lijiayin
*/
public class LazySingleton {
private static volatile LazySingleton lazySingleton = null;
private LazySingleton(){
}
public static LazySingleton getInstance(){
if(lazySingleton == null){
synchronized (LazySingleton.class){
if(lazySingleton == null){
lazySingleton = new LazySingleton();
//1.分配内存给这个对象
//2.初始化对象
//3.设置lazySingleton指向刚才分配的内存
//没有volatile时,2和3可能指令重排序
}
}
}
return lazySingleton;
}
}
- 创建测试类
/**
* @author lijiayin
*/
public class Test {
public static void main(String[] args) {
Thread t1 = new Thread(() -> {
LazySingleton lazySingleton = LazySingleton.getInstance();
System.out.println(Thread.currentThread().getName() + ":" + lazySingleton);
});
Thread t2 = new Thread(() -> {
LazySingleton lazySingleton = LazySingleton.getInstance();
System.out.println(Thread.currentThread().getName() + ":" + lazySingleton);
});
t1.start();
t2.start();
System.out.println("program end");
}
}
-
类的初始化
3.1 单线程中类的初始化,没有volatile关键字
单线程中类的初始化.png
3.2 多线程中类的初始化,没有volatile关键字
多线程中类的初始化.png
网友评论