一道单例模式引起的思考

在Java服务端开发面试过程中,经常会碰到面试官要求面试者实现单例模式,面试官的最低要求是能写出如下代码:

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton(){}
    public static Singleton getInstance() {
        if(instance == null) {
            synchronized(this.class) {
                if(instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    } 
} 

我认为回答使用双重检验锁的方式实现单例模式可以很好地诱导面试官对以下几个问题进行提问,或者自己平时复习时试着能不能很好地回答以下问题:

  1. 什么叫做线程安全?
    多线程执行的结果与预期结果不同
  2. 线程之间通信机制?
    基于共享内存和消息传递机制
  3. 单例模式的线程安全写法,面试者能够清楚地讲述如此实现的原因
  4. synchronized 与 volatile 关键字(重点)
    • synchronized 锁的颗粒度,讨论 synchronized 和 Lock 区别
    • volatile、happens-before 原则、JMM(重点回答主内存和工作内存之间的关系,此外注意和 JVM 内存结构区别)
  5. JVM 内存结构
    程序计数器、Java 虚拟机栈、本地方法栈、堆内存、本地方法区
    试着说说垃圾回收相关知识:垃圾回收器、垃圾回收算法、对象是否可以回收的判断依据

推荐阅读更多精彩内容