面试第2题:单例模式(Singleton)---Android端双重校验锁

面试场景: 写一个你认为最好的单例的实现方式

应对: Android端双重校验锁的单例实现

理解: 理解单例的基本原理,写起来就容易多了,可理解为全局只有这一个实例

手写:已经在代码的注释中说明了面试时,可能会延申的几个小问题;理解不透彻的地方,还请多多指教。

public class SingletonMode {
    /**
     * volatile关键字: 保持内存的可见性--所有线程都能获取的共享内存的最新状态
     * 理解:
     * 不用volatile的状态: 老板让多个人共同完成一件事(初始状态为进行中),假设
     *                    其中某一个人完成后,事件状态变成了已完成;但是
     *                    其他人不知道这件事已完成,认为该事件依然处于进行中
     *                    这就造成了事情的状态与真实状态不同步的现象。
     * 使用volatile的状态:板让多个人共同完成一件事(初始状态为进行中),假设
     *                   其中某一个人完成后,事件状态变成了已完成;此时
     *                   其他人立刻从老板那接到了事情已完成的通知,于是都明确了
     *                   这件事已经完成了。
     * volatile的作用:每次读取前必须先从主存刷新最新的值
     *                每次写入后必须立即同步回主存当中
     */
    private static volatile SingletonMode singletonMode;

    //构造函数修饰为private防止在其他地方创建该实例
    private SingletonMode() {
    }

    /**
     * 有的代码中会将同步锁synchronized写在方法中,例如:
     *    public static synchronized SingletonMode getInstance(){.....}
     * 造成的弊端就是:多线程每次在调用getInstance()时都会产生一个同步,造成损耗。
     * 相应的我们需要保持同步的代码块仅仅就是:
     *      singletonMode = new SingletonMode();
     * 所以只要在该代码处添加同步锁就可以了
     * @return
     */
    public static SingletonMode getInstance() {
        /**
         * 此处检测singletonMode == null,是为了防止当singletonMode已经初始化后,
         * 还会继续调用同步锁,造成不必要的损耗
         */
        if (singletonMode == null) {
            // 加锁目的,防止多线程同时进入造成对象多次实例化
            synchronized (SingletonMode.class) {
                // 为了在null的情况下创建实例,防止不必要的损耗
                if (singletonMode == null) {
                    singletonMode = new SingletonMode();
                }
            }
        }
        // 返回实例对象
        return singletonMode;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Heynchy

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

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

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

打赏作者

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

抵扣说明:

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

余额充值