33.Double checked locking

class Singleton {
    private Singleton(){}
    //懒汉式
    private volatile static Singleton singleton = null;

    public static Singleton getInstance() {
        //这里使用了Double checked locking
        //只有第一次会进入同步代码块产生对象,后面就不会进入同步代码块,提升效率
        //但是存在问题,Synchronized能保证原子性、可见性、有序性
        //但是是在synchronized同步代码块外面的singleton变量不受monitor控制
        //第一个线程还未完全将构造方法执行完毕,如果在构造方法中还要执行很多初始化操作,那么第二个线程获取的singleton将是一个未初始化完毕的单例
        //对singleton使用volatile修饰即可,加入了写屏障,可以禁止指令重排序
        if(singleton == null) {
            synchronized (Singleton.class) {
                if(singleton == null) {
                    singleton = new Singleton();
                }
                return singleton;
            }
        }
        return singleton;
    }
}

这里分析一个重要观点:

synchronized到底能不能保证 有序性?

前提条件:如果Synchronized中的变量完全受synchronized管理控制,那么就能够保证有序性,不会有发生指令重排序的问题。所以Synchronized是能够保证有序性的。

前提条件:如果Synchronized中的变量没有完全受Synchronized管理控制,那么就不能保证有序性,会发生指令重排序的问题。所以Synchronized是不能够保证有序性的,这个时候就需要给变量添加volatile关键字修饰,来保证变量的有序性,防止指令的重排序。

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卷土重来…

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值