文章目录
-
- @[toc]
- 1. Volatile关键字的内存语义
-
- 可见性
- 原子性
- 禁止指令重排序
- 2. 内存屏障
-
- 什么是内存屏障
- volatile语义中的内存屏障
- 内存屏障的作用
- @[toc]
- 可见性
- 原子性
- 禁止指令重排序
- 什么是内存屏障
- volatile语义中的内存屏障
- 内存屏障的作用
1. Volatile关键字的内存语义
可见性
对volatile变量的写操作会把该线程的本地内存中的共享变量值刷新到主内存
对volatile变量的读操作会把本地内存置为无效,并从主内存中读取共享变量
原子性
读、写操作具有原子性,但volatile++这种复合操作不具有原子性;
禁止指令重排序
volatile还能禁止禁止指令重排序;
2. 内存屏障
https://www.jianshu.com/p/2ab5e3d7e510
什么是内存屏障
java的内存屏障有四种即LoadLoad,StoreStore,LoadStore,StoreLoad
处理器在读写操作前后加入内存屏障
在写操作的前面插入一个StoreStore屏障,在写操作的后面插入一个StoreLoad屏障。
在读操作的后面插入一个LoadLoad屏障,在读操作的后面插入一个LoadStore屏障
方便记忆:
写 -> store,读 -> load,
前 -> store,后 -> load
那么写前storestore,写后storeload,读前loadload,读后loadstore
volatile语义中的内存屏障
在每个volatile写操作的前面插入一个StoreStore屏障,在每个volatile写操作的后面插入一个StoreLoad屏障。
在每个volatile读操作的后面插入一个LoadLoad屏障,在每个volatile读操作的后面插入一个LoadStore屏障
内存屏障的作用
内存屏障有两个作用: 1. 禁止屏障两侧的指令重排序;
2. 强制把写缓冲区/高速缓存中的脏数据等写回主内存,让缓存中相应的数据失效。
即violate的可见性、禁止指令重排序,都是通过 JMM内存屏障实现的;