单例模式 volatile 的作用
This commit is contained in:
parent
2329cea6f7
commit
f620065c81
|
@ -126,6 +126,19 @@ if (uniqueInstance == null) {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
uniqueInstance 采用 volatile 关键字修饰也是很有必要的。
|
||||||
|
|
||||||
|
`uniqueInstance = new Singleton();` 这段代码其实是分为三步执行。
|
||||||
|
|
||||||
|
1. 分配内存空间。
|
||||||
|
2. 初始化对象。
|
||||||
|
3. 将 uniqueInstance 指向分配的内存地址。
|
||||||
|
|
||||||
|
但是由于 JVM 具有指令重排的特性,有可能执行顺序变为了 `1>3>2`,这在单线程情况下自然是没有问题。但如果是多线程就有可能 B 线程获得是一个还没有被初始化的对象以致于程序出错。
|
||||||
|
|
||||||
|
所以使用 volatile 修饰的目的是禁止 JVM 的指令重排,保证在多线程环境下也能正常运行。
|
||||||
|
|
||||||
# 三、简单工厂
|
# 三、简单工厂
|
||||||
|
|
||||||
## 意图
|
## 意图
|
||||||
|
|
Loading…
Reference in New Issue
Block a user