File tree 1 file changed +32
-28
lines changed
1 file changed +32
-28
lines changed Original file line number Diff line number Diff line change @@ -84,21 +84,24 @@ Java 中可以使用 `volatile` 来保证顺序性,`synchronize 和 lock` 也
84
84
可以用 ` volatile ` 实现一个双重检查锁的单例模式:
85
85
86
86
``` 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
+ }
102
105
```
103
106
104
107
这里的 ` volatile ` 关键字主要是为了防止指令重排。
@@ -108,23 +111,24 @@ public class Singleton{
108
111
- 初始化对象。(2)
109
112
- 将 ` singleton ` 对象指向分配的内存地址。(3)
110
113
111
- 加上 ` volatile ` 是为了让以上的三步操作顺序执行,反之有可能第二步在第三步之前被执行就有可能某个线程拿到的单例对象是还没有初始化的,以致于报错 。
114
+ 加上 ` volatile ` 是为了让以上的三步操作顺序执行,反之有可能第三步在第二步之前被执行就有可能导致某个线程拿到的单例对象还没有初始化,以致于使用报错 。
112
115
113
116
#### 控制停止线程的标记
114
117
115
118
``` 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
+ }
128
132
```
129
133
130
134
这里如果没有用 volatile 来修饰 flag ,就有可能其中一个线程调用了 ` stop() ` 方法修改了 flag 的值并不会立即刷新到主内存中,导致这个循环并不会立即停止。
You can’t perform that action at this time.
0 commit comments