下午面了三个5年左右经验的Java工程师,一个线程安全的单例模式,愣是没一个写的完整的。 有一个面试资深工程师,居然搞不清楚synchronized的作用域; // 双重同步锁,检测模式 @ThreadSafe public class Singleton4Link { // 私有构造函数 private Singleton4Link(){ } // 单例对象 volatile + 双重检测机制 -> 确保线程安全,禁止指令重排 private static volatile Singleton4Link instance = null; // 静态工厂方法 public static Singleton4Link getInstance(){ if(instance == null){ // 双重检测机制,加上锁 synchronized (Singleton4Link.class) { if(instance == null){ instance = new Singleton4Link(); } } } return instance; } // 1、 memory = allocate() 分配对象内存空间 // 2、 ctorInstance() 初始化对象 // 3、 设定instance指向刚分配的内存; // JVM 和 CPU 优化发生了指令重排 }