美文网首页
DCL单例模式

DCL单例模式

作者: Kamiya_ | 来源:发表于2020-07-01 13:58 被阅读0次
    DCL(Double Check Lock双端检锁机制)单例模式:适用于多线程高并发场景
    /**
     * DCL(Double Check Lock双端检锁机制)单例模式:适用于多线程高并发场景
     */
    public class SingletonPattern {
        //DCL机制不一定线程安全,原因是有指令重排序的存在,加入volatile可以禁止指令重排,
        //原因在于某一个线程执行到第一次检测,读取到singletonPattern不为null时,singletonPattern的引用对象可能没有完成初始化。
        //创建对象分三步,1、分配对象内存空间 2、初始化对象 3、设置singletonPattern指向刚分配的内存地址,此时singletonPattern != null
        //步骤2和步骤3不存在数据依赖关系,而且五轮重排前还是重排后程序的执行结果在单线程中并没有改变,因此这种重排优化是允许的。
        private volatile static SingletonPattern singletonPattern = null;
    
        private SingletonPattern(){
            //对象创建成功后打印,如单例模式,应只打印一次
            System.out.println(Thread.currentThread().getName() + " : " + "SingletonPattern!");
        }
    
        private static SingletonPattern getSingletonPattern (){
            if(singletonPattern == null){
                //如多个线程同时进入,那么在进行一次加锁验证,保证只创建一个对象
                synchronized (SingletonPattern.class){
                    if(singletonPattern == null){
                        singletonPattern = new SingletonPattern();
                    }
                }
            }
            //如果未加volatile导致指令重排,其他线程可能会直接返回未初始化的对象。
            return singletonPattern;
        }
    
        public static void main(String[] args) {
            for(int i = 0; i < 100 ; i++){
                new Thread(() -> {
                    getSingletonPattern();
                },String.valueOf(i)).start();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:DCL单例模式

          本文链接:https://www.haomeiwen.com/subject/blzqyhtx.html