【剑指offer第2版-第2题-JAVA】

实现Singleton模式

题目:
设计一个类,我们只能生成该类的一个实例

饿汉模式-最简单最快的写法

public class SingletonH{
    private SingletonH(){};
    private static  SingletonH singletonH = new SingletonH();
    public static SingletonH getInstance() {
        return singletonH;
    }
}

懒汉模式

public class SingletonL{
    private SingletonL(){};
    private static SingletonL singletonL =null;
    public static SingletonL getInstance() {
        if(singletonL ==null) {
            synchronized (SingletonH.class) {
                if (singletonL == null) {
                    singletonL = new SingletonL();
                }
            }
        }
        return singletonL;
    }
 }

双重检查锁

public 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.为什么要使用volatile关键字?

多个线程同时访问时,volatile关键字可以把线程的工作内存已实例的对象即刻同步到主内存中,同时也能禁止指令重排.给对象分配内存,调用对象的构造方法,把引用指向分配的内存空间,这是正常逻辑的3个步骤,但是Java内存模型允许这个进行指令重排序,也就是这3步可能是123也可能是132,所以这里就有问题了,使用volatile结合两次instance==null判空,这样更严谨.

总结:

  1. 面试是表现自己的机会,不要当成考试,不要紧张,尽可能的表达自己的想法和思路.
  2. 学会引导面试官,聊自己擅长的领域,从面试官的话题延伸到自己擅长的方向.
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值