From df9ef337abe22b7c2b6b5778cbf950eb962debf4 Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Tue, 25 Aug 2020 15:25:39 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E5=8D=95=E4=BE=8B=E6=A8=A1=E5=BC=8F.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blogs/DesignMode/单例模式.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) 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