Skip to content

Commit 57608cb

Browse files
committed
✏️ Fixing typos.
1 parent 7f8ab3d commit 57608cb

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

MD/concurrent/volatile.md

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,29 @@
22

33
## 前言
44

5-
不管是在面试,还是实际开发中 `volatile` 都是一个应该掌握的技能。
5+
不管是在面试还是实际开发中 `volatile` 都是一个应该掌握的技能。
66

77
首先来看看为什么会出现这个关键字。
88

99
## 内存可见性
10-
由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。
10+
由于 `Java` 内存模型(`JMM`)规定,所有的变量都存放在主内存中,而每个线程都有着自己的工作内存(高速缓存)。
1111

12-
线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存的(效率提高),不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。
12+
线程在工作时,需要将主内存中的数据拷贝到工作内存中。这样对数据的任何操作都是基于工作内存(效率提高),并且不能直接操作主内存以及其他线程工作内存中的数据,之后再将更新之后的数据刷新到主内存中。
1313

1414
> 这里所提到的主内存可以简单认为是**堆内存**,而工作内存则可以认为是**栈内存**
1515
1616
如下图所示:
1717

1818
![](https://ws2.sinaimg.cn/large/006tKfTcly1fmouu3fpokj31ae0osjt1.jpg)
1919

20-
所以在并发运行时会出现线程 B 所读取到的数据是线程 A 更新之前的数据。
20+
所以在并发运行时可能会出现线程 B 所读取到的数据是线程 A 更新之前的数据。
2121

2222
显然这肯定是会出问题的,因此 `volatile` 的作用出现了:
2323

2424
> 当一个变量被 `volatile` 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据。
2525
26+
*`volatile` 修饰之后并不是让线程直接从主内存中获取数据,依然需要将变量拷贝到工作内存中*
27+
2628
### 内存可见性的应用
2729

2830
当我们需要在两个线程间依据主内存通信时,通信的那个变量就必须的用 volatile 来修饰:

0 commit comments

Comments
 (0)