volatile关键字与双重检验锁单例模式

本文探讨了volatile关键字如何确保变量在线程间的可见性及禁止指令重排序,深入解析了双重检验锁模式下,volatile如何保障懒汉式单例模式在多线程环境中的对象完整性和唯一性。

volatile关键字的特性

  1、保证被volatile定义的变量对所有线程的可见性

  •         即某线程对volatile变量的操作,其他线程会立刻得知

  2、使用volatile变量的语义是禁止指令重排序

  •        volatile变量前面的操作结果对于后面的操作可见的。

  •        volatile变量前面的代码一定会先于后面的代码执行。

由于普通写法的懒汉式单例模式在多线程情况下是不安全的,所以出现了安全的懒汉式单例模式的写法,即双重检验锁模式。

class Singleton{
    // 确保产生的对象完整性
    private volatile static Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if(instance==null) { // 第一次检查
            synchronized (Singleton.class) {
                if(instance==null) // 第二次检查
                    instance = new Singleton();
            }
        }
        return instance;
    }
}

双重检验锁的原因:

  1、第一次检查,目的是检查当前对象是否已经被初始化。

  2、第二次检查,是防止对象被初始化多次。

        假设线程A在完成对象的初始化后,释放锁,在返回此对象之前,线程B获得锁,然后再次进行初始化操作。这样会导致生成多个对象实例。

  3、使用volatile关键字,是为了保证对象被初始化完成后,才被返回。

        因为 instance = new Singleton();不是原子性操作。假设线程A还尚未将对象的属性初始化完毕,而线程B在第一次检查时,就发现当前对象不为空,然后返回该对象。这样就会破坏对象的完整性。

双重检验是一种实现单例模式的机制。该模式的主要目的是在多线程环境下确保只有一个实例被创建。它结合了懒汉模式饿汉模式的优点。 在双重检验机制中,使用了两个判空操作。第一次判空是为了避免不必要的同步操作,如果实例已经被创建,就不需要再进入同步代码块。第二次判空是在synchronized块内部进行的,这样可以确保在多线程环境下只有一个线程可以创建实例。 具体实现中,使用了volatile关键字来保证多线程下的可见性。而synchronized关键字则保证了在多线程环境下只有一个线程可以进入同步代码块,避免了多个线程同时创建实例的问题。 总结来说,双重检验模式是一种在多线程环境下安全且高效地创建单例实例的方式。它通过两次判空使用volatilesynchronized关键字来保证线程安全可见性。这种模式在需要延迟实例化的场景下非常适用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [单例模式----双重检查](https://blog.youkuaiyun.com/weixin_50005657/article/details/115803998)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [单例模式之「双重校验锁」](https://blog.youkuaiyun.com/weixin_44471490/article/details/108929289)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值