package com.example.sgg.designpattern.single;
/**
* DCL懒汉式 + volatile 的单例模式
* Created by 奔跑的蜗牛 on 2022/4/24 0024.
* 每天学习一点点,每天进步一点点
*/
public class LazyMan {
private LazyMan() {
System.out.println(Thread.currentThread().getName() + "ok" + System.currentTimeMillis());
}
private static volatile LazyMan lazyMan;
//双重检测锁模式的 懒汉式,简称DCL懒汉式
public static LazyMan getInstance() {
if (lazyMan == null) {
synchronized (LazyMan.class) {
if (lazyMan == null) {
lazyMan = new LazyMan();
/*
1、分配内存空间
2、执行构造方法
3、把这个对象指向这个空间
123 正常顺序
132 如果是这个顺序,在A线程执行了3还没有执行2
B线程发现lazyMan不等于空,这时直接返回,这样这个实例是没有完全初始化的,不安全,因此要加入volatile防止指令重排
*/
}
}
}
return lazyMan;
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
new Thread(LazyMan::getInstance, String.valueOf(i)).start();
}
}
}