单例模式之懒汉式

两版懒汉式
第一版直接将synchronized加入到类上
第二版采用DCL模式,性能更好。

//第一版 锁的范围太大,性能比较低
public class Singleton2 {
    private Singleton2(){

    }
    private static Singleton2 singleton2;

    public synchronized static Singleton2 getInstance(){
        if(singleton2 == null){
            singleton2 = new Singleton2();
        }
        return singleton2;
    }
}

//第二版	DCL创建单例对象 双重检测锁 DOUBLE CHECK LOCK
public class Singleton2 {
    private Singleton2(){

    }
    // 问题1:解释为什么要加 volatile ? => synchronized里面的代码块是有可能会重排序的,volatile有序性,可以防止指令重排。
    private volatile static Singleton2 singleton2;
	// 问题2:对比第一版, 说出这样做的意义 =>第二次调用的时候,如果不为空,就可以直接返回了,保证性能优越性。
    public static Singleton2 getInstance(){
        if(singleton2 == null){
            synchronized (Singleton2.class){
                // 问题3:为什么还要在这里加为空判断, 之前不是判断过了吗 =>防止对象重复创建
                if(singleton2 == null){
                    singleton2 = new Singleton2();
                }
            }
        }
        return singleton2;
    }
}

问题总结:
第一版相对于第二版的缺点?

第二版中:
问题1:解释为什么要加 volatile ?
问题2:对比第一版, 说出这样做的意义?
问题3:为什么还要在这里加为空判断, 之前不是判断过了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值