单利模式的一种典型实现方式,双重检验锁。需要说明的是instance必须是volatile修饰的, 因为instance = new SingleInstance()这句话在jvm中的执行步骤如下: 1. 在堆内存中分配一个新的SingleInstance实例内存空间 2. 执行SingleInstance构造函数 3. 将新的实例的引用赋值给instance 由于jvm会进行指令重排的优化,所以有可能执行顺序变成1->3->2,这在单线程情况下没问题,但是如果有另一个线程同时也在调用getInstance方法,就有可能获取到未初始化的实例引用;而volatile关键字的一个作用就是禁止指令重排。 public class SingleInstance { private static volatile SingleInstance instance; private static final Object INSTANCE_LOCK = new Object(); public static SingleInstance getInstance() { if (null == instance) { synchronized (INSTANCE_LOCK) { if (null == instance) { instance = new SingleInstance(); } } } return instance; } private SingleInstance() { } }
单例模式
最新推荐文章于 2019-04-22 00:04:04 发布