Skip to content

Commit 5d00c95

Browse files
committed
更新
1 parent 410163d commit 5d00c95

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

MD/Threadcore.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,15 @@ int b = 200 ; //2
6767
int c = a + b ; //3
6868
```
6969

70-
正常情况下的执行顺序应该是 `1>>2>>3`。但是有时 `JVM` 为了提高整体的效率会进行指令重排导致执行的顺序可能是 `2>>1>>3`。但是 JVM 也不能是什么都进行重排,是在保证最终结果和代码顺序执行结果一致的情况下才可能进行重排。
70+
正常情况下的执行顺序应该是 `1>>2>>3`。但是有时 `JVM` 为了提高整体的效率会进行指令重排导致执行的顺序可能是 `2>>1>>3`。但是 `JVM` 也不能是什么都进行重排,是在保证最终结果和代码顺序执行结果一致的情况下才可能进行重排。
7171

7272
重排在单线程中不会出现问题,但在多线程中会出现数据不一致的问题。
7373

7474
Java 中可以使用 `volatile` 来保证顺序性,`synchronize 和 lock` 也可以来保证有序性,和保证原子性的方式一样,通过同一段时间只能一个线程访问来实现的。
7575

76-
除了通过 `volatile` 关键字显式的保证顺序之外, JVM 还通过 `happen-before` 原则来隐式的保证顺序性。
76+
除了通过 `volatile` 关键字显式的保证顺序之外, `JVM` 还通过 `happen-before` 原则来隐式的保证顺序性。
7777

78-
其中有一条就是适用于 volatile 关键字的,针对于 volatile 关键字的写操作肯定是在读操作之前,也就是说读取的值肯定是最新的。
78+
其中有一条就是适用于 `volatile` 关键字的,针对于 `volatile` 关键字的写操作肯定是在读操作之前,也就是说读取的值肯定是最新的。
7979

8080
### volatile 的应用
8181

@@ -129,7 +129,7 @@ private void stop(){
129129

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

132-
这里主要利用的是 volatile 的内存可见性。
132+
这里主要利用的是 `volatile` 的内存可见性。
133133

134134
总结一下:
135135
- volatile 关键字只能保证可见性,顺序性,**不能保证原子性**

0 commit comments

Comments
 (0)