Juc12_Volatile的可见性、不保证可见性、有序性、使用、内存屏障四大指令StoreStore、StoreLoad 、LoadLoad、LoadStore(二)

简介: ③. happens-before之volatile变量规则④. JMM 就将内存屏障插⼊策略分为4种

③. happens-before之volatile变量规则


①.当第一个操作为volatile读时,不论第二个操作是什么,都不能重排序。这个操作保证了volatile读之后的操作不会被重排到volatile读之前


②.当第二个操作为volatile写时,不论第一个操作是什么,都不能重排序。这个操作保证了volatile写之前的操作不会被重排到volatile写之后


③.当第一个操作为volatile写时,第二个操作为volatile读时,不能重排


微信图片_20220108124503.png


④. JMM 就将内存屏障插⼊策略分为4种


  • ①. 写
    在每个volatile写操作的前⾯插⼊⼀个StoreStore屏障


在每个volatile写操作的后⾯插⼊⼀个StoreLoad屏障


微信图片_20220108124521.png


②. 读

在每个volatile读操作的后⾯插⼊⼀个LoadLoad屏障

在每个volatile读操作的后⾯插⼊⼀个LoadStore屏障


微信图片_20220108124544.png


③. 代码展示


//模拟一个单线程,什么顺序读?什么顺序写?
public class VolatileTest {
    int i = 0;
    volatile boolean flag = false;
    public void write(){
        i = 2;
        flag = true;
    }
    public void read(){
        if(flag){
            System.out.println("---i = " + i);
        }
    }
}


微信图片_20220108124604.png

目录
打赏
0
相关文章
|
10月前
|
理解内存序,指令重排与内存模型
理解内存序,指令重排与内存模型
132 0
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
185 20
|
9月前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
136 1
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
900 1
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
|
10月前
|
【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间
【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间
167 1
volatile底层的实现原理:volatile关键字的作用、内存模型、JMM规范和CPU指令
volatile底层的实现原理:volatile关键字的作用、内存模型、JMM规范和CPU指令
183 0
持久内存指令(PMDK)简介
持久内存指令(PMDK)简介
356 0
通过地址和索引实现数组、CPU指令执行过程、内存概述及内存物理结构
通过地址和索引实现数组、CPU指令执行过程、内存概述及内存物理结构
136 0
PPC902AE101 3BHE010751R0101 访问指令来增加CPU内存子系统的带宽
PPC902AE101 3BHE010751R0101 访问指令来增加CPU内存子系统的带宽
134 0
PPC902AE101 3BHE010751R0101 访问指令来增加CPU内存子系统的带宽
实验一:查看CPU和内存,用机器指令和汇编指令编程
实验一:查看CPU和内存,用机器指令和汇编指令编程
245 0