java 单例双检锁
程序员文章站
2022-07-14 09:10:33
...
public class InstanceT {
// private 保证无法在在类以外被创建
private InstanceT(){};
// volatile 保证指令不被排序,防止指令重排序后,多线程情况下拿到半初始化的对象instance。
// 使用 synchronized 在 synchronized 作用的区域内相当于是单线程在执行,单线程下的指令重排序是没有问题,但是这个场景不是单线程,所以需要 volatile 来保证有序性,防止cpu为了性能进行指令重排序。
private static volatile InstanceT instance;
public static InstanceT getInstance() {
// 多线程情况下,先判断 instance 是否为 null 后上锁,可以提升性能,反之多个线程都需要 synchronized
if (instance == null) {
synchronized (InstanceT.class) {
// 防止在上锁阶段,对象被别的线程已经创建,需要再次判断 instance 是否为 null
if (instance == null) {
instance = new InstanceT();
}
}
}
return instance;
}
}
上一篇: 单例模式的七种写法
下一篇: Java单例模式中双检锁的线程安全问题