Skip to content

Commit 1efea9e

Browse files
authored
Merge pull request crossoverJie#68 from crossoverJie/fix
🐛 Fixing a bug. crossoverJie#65
2 parents c31de47 + 3b500da commit 1efea9e

File tree

1 file changed

+32
-28
lines changed

1 file changed

+32
-28
lines changed

Diff for: MD/Threadcore.md

+32-28
Original file line numberDiff line numberDiff line change
@@ -84,21 +84,24 @@ Java 中可以使用 `volatile` 来保证顺序性,`synchronize 和 lock` 也
8484
可以用 `volatile` 实现一个双重检查锁的单例模式:
8585

8686
```java
87-
public class Singleton{
88-
private static volatile Singleton singleton ;
89-
private Singleton(){}
90-
public static Singleton getInstance(){
91-
if(singleton == null){
92-
synchronize(Singleton.class){
93-
if(singleton == null){
94-
singleton = new Singleton();
95-
}
96-
}
97-
}
98-
return singleton ;
99-
}
100-
101-
}
87+
public class Singleton {
88+
private static volatile Singleton singleton;
89+
90+
private Singleton() {
91+
}
92+
93+
public static Singleton getInstance() {
94+
if (singleton == null) {
95+
synchronized (Singleton.class) {
96+
if (singleton == null) {
97+
singleton = new Singleton();
98+
}
99+
}
100+
}
101+
return singleton;
102+
}
103+
104+
}
102105
```
103106

104107
这里的 `volatile` 关键字主要是为了防止指令重排。
@@ -108,23 +111,24 @@ public class Singleton{
108111
- 初始化对象。(2)
109112
-`singleton` 对象指向分配的内存地址。(3)
110113

111-
加上 `volatile` 是为了让以上的三步操作顺序执行,反之有可能第二步在第三步之前被执行就有可能某个线程拿到的单例对象是还没有初始化的,以致于报错
114+
加上 `volatile` 是为了让以上的三步操作顺序执行,反之有可能第三步在第二步之前被执行就有可能导致某个线程拿到的单例对象还没有初始化,以致于使用报错
112115

113116
#### 控制停止线程的标记
114117

115118
```java
116-
private volatile boolean flag ;
117-
private void run(){
118-
new Thread(new Runnable(){
119-
if(flag){
120-
doSomeThing();
121-
}
122-
});
123-
}
124-
125-
private void stop(){
126-
flag = false ;
127-
}
119+
private volatile boolean flag ;
120+
private void run(){
121+
new Thread(new Runnable() {
122+
@Override
123+
public void run() {
124+
doSomeThing();
125+
}
126+
});
127+
}
128+
129+
private void stop(){
130+
flag = false ;
131+
}
128132
```
129133

130134
这里如果没有用 volatile 来修饰 flag ,就有可能其中一个线程调用了 `stop()`方法修改了 flag 的值并不会立即刷新到主内存中,导致这个循环并不会立即停止。

0 commit comments

Comments
 (0)