volatile 内存语义
Posted xmsx
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile 内存语义相关的知识,希望对你有一定的参考价值。
读内存语义:当读一个 volatile 变量时,JMM 将该线程对应的本地内存置为无效,从主内存中读取共享变量。
写内存语义:当写一个 volatile 变量时,JMM 将该线程对应的本地内存中的共享变量值刷新到主内存。
读写内存语义加起来,就能保证可见性:一个线程修改了 volatile 修饰的共享变量之后,另一个线程可以读到这个修改后的值。
内存语义怎么实现?需要 JMM 限制《重排序》。
限制规则如下图:
volatile 读写之间禁止重排序是毋庸置疑的。
另外请看下图,为了保证 1 happen before 4,另外两项重排序也是需要禁止的。
而限制重排序的手段就是插入内存屏障:
- 在每个 volatile 读操作的后面插入一个 LoadLoad 屏障。
- 在每个 volatile 读操作的后面插入一个 LoadStore 屏障。
- 在每个 volatile 写操作的前面插入一个 StoreStore 屏障。
- 在每个 volatile 写操作的后面插入一个 StoreLoad 屏障。
内存屏障的类型:
以上是关于volatile 内存语义的主要内容,如果未能解决你的问题,请参考以下文章
java多线程03-----------------volatile内存语义