DCL (双端检锁)机制不一-定线程安全,原因是有指令重排序的存在,加入volatile可 以禁止指令重排

单例模式DCL代码:

package com.youliao.java;

import com.sun.org.apache.bcel.internal.generic.SIPUSH;
import sun.reflect.generics.tree.ShortSignature;

import java.lang.management.ThreadInfo;

/**
 * @Author Dali
 * @Date 2021/5/14 21:14
 * @Version 1.0
 * @Description :单例模式在多线程环境下可能存在安全问题
 */
public class SingletonDemo {
    private static volatile SingletonDemo instance = null;
    private SingletonDemo(){
        System.out.println(Thread.currentThread().getName()+"\t 我是构造方法SingletonDemo()");
    }

    //DCL(Double Check Lock双端检索机制)
    public static SingletonDemo getInstance() {
        if (instance == null){
             synchronized (SingletonDemo.class){
                 if (instance == null) {
                     instance = new SingletonDemo();
                 }
             }
          //  instance = new SingletonDemo();
        }
        return instance;
    }

    public static void main(String[] args) {

        //并发多线程后,情况发生了很大的变化
        for (int i = 0; i <= 10; i++) {
            new Thread(()->{
                SingletonDemo. getInstance();
            },String.valueOf(i)).start();
        }
    }
}

运行结果:在这里插入图片描述


版权声明:本文为qq_36833593原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。