请选择 进入手机版 | 继续访问电脑版

Java之volatile在单例模式下的使用场景(DCL)

[复制链接]
三兄弟沙发谢洪江 发表于 2020-12-31 19:23:00 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
 废话不多说,都写注释里面了,直接上代码!!!
  1. package com.xiao.myvolatile;/** * @description 单例模式,双重检查案例(Double Check Lock) * @auther: 笑笑是一个码农 * @date: 22:38 2020/11/17 */public class VolatileSingletonDcl {    public static void main(String[] args) {        // 单线程下单例模式测试//        System.out.println(SingletonDemo.getInstance());//        System.out.println(SingletonDemo.getInstance());//        System.out.println(SingletonDemo.getInstance());        for (int i = 0; i < 10; i++) {            new Thread(() -> {                // 线程不安全单例模式测试,多个线程,会创建多个对象//                System.out.println(SingletonDemo.getInstance());                // DCL 机制测试                System.out.println(SingletonDemo.dclGetInstance());            }).start();        }    }}class SingletonDemo{    private static SingletonDemo instance = null;    private static volatile SingletonDemo instance1 = null;    public SingletonDemo(){        System.out.println("构造方法被调用");    }    // 线程不安全单例模式    public static SingletonDemo getInstance(){        if (instance == null){            instance = new SingletonDemo();        }        return instance;    }    // DCL机制    public static SingletonDemo dclGetInstance(){        if (instance1 == null){            synchronized (SingletonDemo.class){                if (instance1 == null){                    // 创建对象可以拆分为三部                    // 1、为对象分配内存                    // 2、初始化对象                    // 3、设置instance1指向刚才分配的内存,此时instance1不便是null                    // 但如果不加volatile,会存在指令重排的可能,2、3步不存在数据依赖关系,可能会先执行第3步,单线程没有问题                    // 多线程下,当第一个线程先执行了第3步,此时cpu发生调治,另一个线程判定instance1 == null为false, 但实际上对象另有没初始化完成                    instance1 = new SingletonDemo();                }            }        }        return instance1;    }}
复制代码
 

来源:https://blog.csdn.net/u012430402/article/details/111999276
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )