DCL懒汉式 + volatile 的单例模式

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();
        }
    }
}

你可能感兴趣的:(Java,java)