加同步块与volatile即可
public class MyBenchmark {
public static void main(String[] args) {
new Thread(() -> {
Singleton instance1 = Singleton.getInstance();
}, "t1").start();
new Thread(() -> {
Singleton instance2 = Singleton.getInstance();
}, "t2").start();
}
}
@Slf4j(topic = "c.Singleton")
class Singleton {
private static volatile Singleton instance;
private Singleton() {
}
// 双重检查
public static Singleton getInstance() {
if (instance == null) { //t1、t2都可进入
synchronized (Singleton.class) {
if (instance == null) { //t1进入后,随后t2不可再进入
instance = new Singleton();
log.debug("已创建");
}
}
}
return instance;
}
}