File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -67,15 +67,15 @@ int b = 200 ; //2
6767int 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
7474Java 中可以使用 ` 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 关键字只能保证可见性,顺序性,** 不能保证原子性** 。
You can’t perform that action at this time.
0 commit comments