标签:变量 假设 sync null ret 调用 懒汉式单例模式 安全 需要
public class DoubleCheckedLocking { private static volatile DoubleCheckedLocking instance; private DoubleCheckedLocking() { } public static DoubleCheckedLocking getInstance() { //已经存在对象,避免不必要的同步 if (null != instance) { return instance; } synchronized (DoubleCheckedLocking.class) { if (null == instance) { //3.这里有可能发生指令重排 instance = new DoubleCheckedLocking(); //new一个对象 1.开辟空间 2.初始化对象信息 3.返回对象的地址给引用 //假设new这个对象很耗时(可能存在大量成员变量),可能存在先执行3,再执行2 //A线程在初始化对象,3步骤先于2执行,先返回引用,假设此时B线程执行if判断,则返回instance,但这里instance并没有完成初始化,在使用中可能会产生NPE异常 } } return instance; } }
/** * 线程安全,懒加载,无锁效率高 */ public class SingletonObject2 { private SingletonObject2() { } /** * static可以保证在jvm中唯一性 * 需要时才会加载 * 当线程调用getInstance() class InstanceHolder 会主动加载,并初始化构建instance对象 * java内存模型保证类初始化是线程安全的 */ private static class InstanceHolder { private static final SingletonObject2 instance = new SingletonObject2(); } private static SingletonObject2 getInstance() { return InstanceHolder.instance; } }
标签:变量 假设 sync null ret 调用 懒汉式单例模式 安全 需要
原文地址:https://www.cnblogs.com/MadYanYan/p/11703238.html