File tree 1 file changed +4
-4
lines changed
1 file changed +4
-4
lines changed Original file line number Diff line number Diff line change 27
27
28
28
### 内存可见性的应用
29
29
30
- 当我们需要在两个线程间依据主内存通信时,通信的那个变量就必须的用 volatile 来修饰:
30
+ 当我们需要在两个线程间依据主内存通信时,通信的那个变量就必须的用 ` volatile ` 来修饰:
31
31
32
32
``` java
33
33
public class Volatile implements Runnable {
@@ -108,10 +108,10 @@ public class VolatileInc implements Runnable{
108
108
109
109
当我们三个线程(t1,t2,main)同时对一个 ` int ` 进行累加时会发现最终的值都会小于 30000。
110
110
111
- > 这是因为虽然 ` volatile ` 保证了内存可见性,保证了每个线程拿到的值都是最新值 ,但 ` count ++ ` 这个操作并不是原子的,这里面涉及到获取值、自增、赋值的操作并不能同时完成。
111
+ > 这是因为虽然 ` volatile ` 保证了内存可见性,每个线程拿到的值都是最新值 ,但 ` count ++ ` 这个操作并不是原子的,这里面涉及到获取值、自增、赋值的操作并不能同时完成。
112
112
>
113
113
114
- - 所以想到达到线程安全可以使这三个线程串行执行(那其实就是单线程 ,没有发挥多线程的优势)。
114
+ - 所以想到达到线程安全可以使这三个线程串行执行(其实就是单线程 ,没有发挥多线程的优势)。
115
115
116
116
- 也可以使用 ` synchronize ` 或者是锁的方式来保证原子性。
117
117
@@ -120,7 +120,7 @@ public class VolatileInc implements Runnable{
120
120
121
121
## 指令重排
122
122
123
- 内存可见性只是 volatile 的其中一个作用 ,它还可以防止 JVM 进行指令重排优化。
123
+ 内存可见性只是 ` volatile ` 的其中一个语义 ,它还可以防止 JVM 进行指令重排优化。
124
124
125
125
举一个伪代码:
126
126
You can’t perform that action at this time.
0 commit comments