懒汉式单例模式(延时加载)

单例模式(Singleton Pattern)是一种对象创建型模式

单例模式:确保一个类仅有一个实例,且自行实例化,并对外提供这个唯一的实例

单例模式实现方式分为非延时加载(饿汉式 Eager Singleton)和 延时加载(懒汉式 Lazy Singleton),延时加载( 节省内存)可以有效提高系统资源的利用效率,所以通常使用延时加载的懒汉式实现


懒汉式,线程不安全
/**
 * 懒汉式单例模式,线程不安全
 */
class LazySingleton {
   
   

    //这里省略了属性...

	//将构造函数设为private
    private LazySingleton(){
   
   

    }

	//与饿汉式不同,懒汉式并不会立即初始化
    private static LazySingleton instance = null;

    public static LazySingleton getInstance(){
   
   
        if(instance == null){
   
   
            instance = new LazySingleton();
        }
        return instance;
    }
}

懒汉式单例模式在第一次调用 getInstance() 方法时,实例化 LazySingleton 对象,在类加载时并不自行实例化,这种技术称为:延时加载技术(Lazy Load)

上诉代码存在线程安全问题。在多线程情况下:

🍁1️⃣ 线程A进入 if (instance == null) 中,还没来的及执行 instance = new LazySingleton(); 语句创建 instance 对象,时间片就切换给了线程B ;🍁2️⃣ 此时由于instance 对象还没创建,instance 对象为空,所以线程B也进入if (instance == null) 中,并顺利执行 instance = new LazySingleton(); 语句创建了instance 对象 ;🍁3️⃣ 在线程A重新获得时间片后,开始执行 instance = new LazySingleton(); 语句,也创建了instance 对象。🍀4️⃣ 此时线程A 和 线程B都创建了instance对象,这就违背了单例模式的初衷。


所以严格意义上 懒汉式,线程不安全 并不算单例模式,因为它在多线程情况下不能正常工作。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

家师曹先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值