懒汉式单列+双重检测锁+原子性操作
// 懒汉模式、双重检测锁+原子性操作
public class LazyDemo {
private LazyDemo() {
System.out.println(Thread.currentThread().getName());
}
private volatile static LazyDemo lazy;
public static LazyDemo getLazy() {
// 双重检测锁模式 懒汉式单例 DCL懒汉式
if (lazy == null) {
synchronized (LazyDemo.class) {
if (lazy == null) {
lazy = new LazyDemo();// 不是一个原子性操作
// 1、分配内存空间
// 2、执行构造方法,初始化对象
// 3、把对象指向到内存空间
// 具体计算机执行时,可能存在指令重排,导致:123,132顺序的出现,导致返回数据还没有执行构造方法而直接返回,导致问题。
}
}
}
return lazy;
}
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
new Thread(() -> {
LazyDemo.getLazy();
}).start();
}
}
}
2、反射破坏单列
public static void main(String[] args) throws Exception {
LazyDemo lazyDemo1 = LazyDemo.getLazy();
Constructor<LazyDemo> declaredConstructor = LazyDemo.class.getDeclaredConstructor(null);
LazyDemo lazyDemo2 = declaredConstructor.newInstance();
System.out.println(lazyDemo1);
System.out.println(lazyDemo2);
}
输出结果
com.asia.tip.tcpchat.LazyDemo@15db9742
com.asia.tip.tcpchat.LazyDemo@6d06d69c