美团Android开发200道面试题及参考答案(下)

单例模式中的双锁机制,分别起到了什么作用

在单例模式的双重检查锁定(DCL,Double Checked Locking)机制中,涉及到两重 “锁” 相关的操作,各自有着重要作用。

首先是外层的同步锁,也就是synchronized关键字修饰的代码块部分。它的主要作用是控制在多线程环境下,同一时刻只有一个线程能够进入到创建单例对象实例的关键代码区域。当多个线程同时调用getInstance方法尝试获取单例对象时,这个锁能够避免多个线程同时去创建实例,防止出现创建出多个实例的情况,保证了在并发场景下实例创建的唯一性。例如,线程 A 和线程 B 同时执行到获取单例对象的方法处,线程 A 获取到外层的同步锁后进入代码块,此时线程 B 就只能等待线程 A 释放锁后才有机会进入,从而避免了它们同时去执行创建实例的操作。

而内层的判空检查,也就是在同步块内再次进行的if (instance == null)判断。它的作用在于,虽然外层已经通过同步锁控制了同时只能有一个线程进入创建实例的代码块,但有可能在这个线程进入同步块前,已经有别的线程经过了外层判空检查且进入同步块创建好了实例。所以内层判空检查就是为了确保当线程进入到这个同步块内时,再次核实单例对象是否真的还没被创建,如果已经创建了就直接返回已有的实例,避免重复创建,进一步保证了单例对象创建的正确性和唯一性,优化了性能,避免了不必要的实例创建操作,提升了多线程环境下获取单例对象的效率。

双重校验锁为什么要两次判空,DCL 为什么要两次判断 null 呢?为什么使用 volatile?

两次判空的原因
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

大模型大数据攻城狮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值