Update 单例模式.md

master
Omooo 4 years ago
parent dbb282743a
commit df9ef337ab
  1. 26
      blogs/DesignMode/单例模式.md

@ -99,6 +99,32 @@ public class Singleton {
但是由于 CPU 的优化操作,可能会对这几个操作进行乱序执行,第二条和第三条的操作的执行顺序无法保证。如果线程 A 执行到 getInstance() 方法,进入锁块,先执行 第三条操作,然后另外一个线程 B 也执行到 getInstance() 方法,发现 mInstance 不为空了,就直接取走了 mInstance 对象,在使用时就会出错,这就是 DCL 失效问题。而 volatile 能禁止指令重排序。 但是由于 CPU 的优化操作,可能会对这几个操作进行乱序执行,第二条和第三条的操作的执行顺序无法保证。如果线程 A 执行到 getInstance() 方法,进入锁块,先执行 第三条操作,然后另外一个线程 B 也执行到 getInstance() 方法,发现 mInstance 不为空了,就直接取走了 mInstance 对象,在使用时就会出错,这就是 DCL 失效问题。而 volatile 能禁止指令重排序。
当然,在高版本不加 volatile 其实也没啥,因为 JVM 已经把 new 作为一个原子操作了。
DCL 还有一种优化的写法是:
```java
class Helper {
private static volatile Helper helper;
public static Helper getHelper() {
Helper localRef = helper;
if (localRef == null) {
synchronized (Helper.class) {
localRef = helper;
if (localRef == null) {
helper = localRef = new Helper();
}
}
}
return localRef;
}
// other functions and members...
}
```
##### 静态内部类 ##### 静态内部类
```java ```java

Loading…
Cancel
Save