diff --git a/blogs/DesignMode/单例模式.md b/blogs/DesignMode/单例模式.md index e999692..4a5126f 100644 --- a/blogs/DesignMode/单例模式.md +++ b/blogs/DesignMode/单例模式.md @@ -99,6 +99,32 @@ public class Singleton { 但是由于 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