/** * 双重检查实现单例模式本身是线程不安全的,主要原因在于instance = new DoubleCheckSingleton()这句代码非原子操作,而编译器又存在指令重排序的问题, * 可能存在线程1先分配内存,然后将instance指向该内存,这时instance并不为空,但并未初始化,若此时线程2调用getInstance方法,则会直接返回instance,然而 * instance并未初始化,因此导致对象访问失败。加上volatile关键字后,可以实现禁止指令重排序,避免这种问题的出现 * @author snlai */ public class DoubleCheckSingleton { private static volatile DoubleCheckSingleton instance; private DoubleCheckSingleton() { } public static DoubleCheckSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckSingleton.class) { if (instance == null) { instance = new DoubleCheckSingleton(); } } } return instance; } }
线程安全的双重检查单例模式
最新推荐文章于 2025-04-23 00:37:43 发布