懒汉模式的单例中对于指令重排序的规避方案

 

懒汉模式的单例中对于指令重排序的规避方案_第1张图片

懒汉模式的单例中对于指令重排序的规避方案_第2张图片

1、双重检查的单例模式中可能会出现第一个非空判断为true,可是instance并没有初始化的情况,这种情况如果线程1去访问instance则会报异常,使用volatile关键字去声明instance可以规避2,3步的指令重排序,进而规避这种问题。

懒汉模式的单例中对于指令重排序的规避方案_第3张图片

懒汉模式的单例中对于指令重排序的规避方案_第4张图片

2、使用静态内部类去初始化单例,在这里java对于内部类是有一个初始化锁的,所以在这个内部类里初始化这个instance是线程安全的。这种方式的核心在于谁先拿到innerClass这个类的初始化锁,谁就去初始化instance,这种情况线程1对于指令重排序是不可见的,也不受影响的。

你可能感兴趣的:(java)