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