调整格式

pull/26/head
AmyliaY 5 years ago
parent 3d8c14eb11
commit c7f6d7717e

@ -17,35 +17,34 @@
* 关键词JVM指令重排、volatile、反射攻击 * 关键词JVM指令重排、volatile、反射攻击
*/ */
public class Singleton3 { public class Singleton3 {
/**
* 对于我们初级开发来说这个volatile在实际开发中可能见过但很少会用到
* 这里加个volatile进行修饰也是本单例模式的精髓所在。
* 下面的 instance = new Singleton3(); 这行代码在JVM中其实是分三步执行的
* 1、分配内存空间
* 2、初始化对象
* 3、将instance指向分配的内存地址。
* 但JVM具有指令重排的特性实际的执行顺序可能会是1、3、2导致多线程情况下出问题
* 使用volatile修饰instance变量 可以 避免上述的指令重排
* tips不太理解的是 第一个线程在执行第2步之前就已经释放了锁导致其它线程进入synchronized代码块
* 执行 instance == null 的判断?
*/
private volatile static Singleton3 instance;
/** private Singleton3(){
* 对于我们初级开发来说这个volatile在实际开发中可能见过但很少会用到
* 这里加个volatile进行修饰也是本单例模式的精髓所在。
* 下面的 instance = new Singleton3(); 这行代码在JVM中其实是分三步执行的
* 1、分配内存空间
* 2、初始化对象
* 3、将instance指向分配的内存地址。
* 但JVM具有指令重排的特性实际的执行顺序可能会是1、3、2导致多线程情况下出问题
* 使用volatile修饰instance变量 可以 避免上述的指令重排
* tips不太理解的是 第一个线程在执行第2步之前就已经释放了锁导致其它线程进入synchronized代码块
* 执行 instance == null 的判断?
*/
private volatile static Singleton3 instance;
private Singleton3(){
} }
public static Singleton3 getInstance(){ public static Singleton3 getInstance(){
if(instance == null){ if(instance == null){
synchronized(Singleton3.class){ synchronized(Singleton3.class){
if(instance == null){ if(instance == null){
instance = new Singleton3(); instance = new Singleton3();
} }
} }
} }
return instance; return instance;
} }
} }
``` ```
**2. 枚举实现** **2. 枚举实现**

Loading…
Cancel
Save