单例模式在多线程环境下的问题

代码如下(示例):

public class SingletonLazy {

    //创建当前类的引用
    private static volatile SingletonLazy s;

    //声明当前类型的引用
    private static SingletonLazy instance = null;

    //构造方法私有化
    private SingletonLazy() {
    }


//    // 存在问题的获取实例方法代码
//    //公共的获取当前对象的方法
//    public static SingletonLazy getInstance() {
//        if (instance == null) {
//            instance = new SingletonLazy();
//        }
//
//        return instance;
//    }

    //代码d分为三个机器指令步骤
    //步骤1:为new出来的对象开辟内存空间
    //步骤2:初始化,执行构造器方法的逻辑代码片段
    //步骤3:完成SingletonLazy引用的赋值操作,将其指向刚刚开辟的内存地址




    //对外提供公共的访问方法将SingletonHungary对象暴露给外部
    public static SingletonLazy getInstance() {
        if(s == null){// a
            //这里有可能会有两个线程进来,所以还需要在下面再次判断s是否为null,该方式被称为双重检查
            //问题场景:线程1执行到d,线程2执行到a,此时d指令重排为132,s非空,但是没执行构造方法,是不完整的
            synchronized(SingletonLazy.class) {// b
                if(s == null){// c
                    s = new SingletonLazy();// d
                }
            }
        }
        return s;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值