diff --git a/notes/pics/dp-singleton.png b/notes/pics/dp-singleton.png
new file mode 100644
index 00000000..ba6f2385
Binary files /dev/null and b/notes/pics/dp-singleton.png differ
diff --git a/notes/设计模式 - 单例.md b/notes/设计模式 - 单例.md
index 67c5f744..b0f62035 100644
--- a/notes/设计模式 - 单例.md
+++ b/notes/设计模式 - 单例.md
@@ -1,19 +1,16 @@
## 单例(Singleton)
-### Intent
-
+### 意图
确保一个类只有一个实例,并提供该实例的全局访问点。
-### Class Diagram
-
+### 类图
使用一个私有构造函数、一个私有静态变量以及一个公有静态函数来实现。
私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。
-
-
-### Implementation
+
+### 实现
#### Ⅰ 懒汉式-线程不安全
以下实现中,私有静态变量 uniqueInstance 被延迟实例化,这样做的好处是,如果没有用到该类,那么就不会实例化 uniqueInstance,从而节约资源。
@@ -105,9 +102,9 @@ uniqueInstance 采用 volatile 关键字修饰也是很有必要的, `uniqueIn
2. 初始化 uniqueInstance
3. 将 uniqueInstance 指向分配的内存地址
-但是由于 JVM 具有指令重排的特性,执行顺序有可能变成 1>3>2。指令重排在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。
+但是由于 JVM 具有重排序的特性,执行顺序有可能变成 1>3>2。重排序在单线程环境下不会出现问题,但是在多线程环境下会导致一个线程获得还没有初始化的实例。例如,线程 T1 执行了 1 和 3,此时 T2 调用 getUniqueInstance() 后发现 uniqueInstance 不为空,因此返回 uniqueInstance,但此时 uniqueInstance 还未被初始化。
-使用 volatile 可以禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。
+使用 volatile 可以禁止 JVM 的重排序,保证在多线程环境下也能正常运行。
#### Ⅴ 静态内部类实现
@@ -175,7 +172,7 @@ public enum Singleton {
}
```
-```html
+```text
firstName
secondName
secondName
@@ -186,16 +183,18 @@ secondName
该实现在多次序列化和反序列化之后,不会得到多个实例。而其它实现需要使用 transient 修饰所有字段,并且提供 readResolve() 方法。
-### Examples
-
+### 示例
- Logger Classes
- Configuration Classes
- Accessing resources in shared mode
- Factories implemented as Singletons
-### JDK
-
+### JDK 中的应用
- [java.lang.Runtime#getRuntime()](http://docs.oracle.com/javase/8/docs/api/java/lang/Runtime.html#getRuntime%28%29)
- [java.awt.Desktop#getDesktop()](http://docs.oracle.com/javase/8/docs/api/java/awt/Desktop.html#getDesktop--)
- [java.lang.System#getSecurityManager()](https://docs.oracle.com/javase/8/docs/api/java/lang/System.html#getSecurityManager--)
+## 参考资料
+
+- 弗里曼. Head First 设计模式 [M]. 中国电力出版社, 2007.
+- Gamma E. 设计模式: 可复用面向对象软件的基础 [M]. 机械工业出版社, 2007.