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

相关文章
|
2月前
|
编译器 C++
理解内存序,指令重排与内存模型
理解内存序,指令重排与内存模型
57 0
|
14天前
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
汇编语言(第四版) 实验一 查看CPU和内存,用机器指令和汇编指令编程
|
2月前
|
存储 程序员 数据处理
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
282 1
【汇编】mov和add指令、确定物理地址的方法、内存分段表示法
|
2月前
|
存储
【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间
【汇编】数据在哪里?有多长、div指令实现除法、dup设置内存空间
|
11月前
|
缓存 安全 Java
volatile底层的实现原理:volatile关键字的作用、内存模型、JMM规范和CPU指令
volatile底层的实现原理:volatile关键字的作用、内存模型、JMM规范和CPU指令
130 0
|
12月前
持久内存指令(PMDK)简介
持久内存指令(PMDK)简介
273 0
|
12月前
|
存储 安全
4.3 x64dbg 搜索内存可利用指令
发现漏洞的第一步则是需要寻找到可利用的反汇编指令片段,在某些时候远程缓冲区溢出需要通过类似于`jmp esp`等特定的反汇编指令实现跳转功能,并以此来执行布置好的`ShellCode`恶意代码片段,`LyScript`插件则可以很好的完成对当前进程内存中特定函数的检索工作。在远程缓冲区溢出攻击中,攻击者也可以利用汇编指令`jmp esp`来实现对攻击代码的执行。该指令允许攻击者跳转到堆栈中的任意位置,并从那里执行恶意代码。
140 0
|
存储 缓存 索引
通过地址和索引实现数组、CPU指令执行过程、内存概述及内存物理结构
通过地址和索引实现数组、CPU指令执行过程、内存概述及内存物理结构
74 0
|
前端开发 rax
实验一:查看CPU和内存,用机器指令和汇编指令编程
实验一:查看CPU和内存,用机器指令和汇编指令编程
168 0
|
存储 缓存 数据库
PPC902AE101 3BHE010751R0101 访问指令来增加CPU内存子系统的带宽
PPC902AE101 3BHE010751R0101 访问指令来增加CPU内存子系统的带宽
102 0
PPC902AE101 3BHE010751R0101 访问指令来增加CPU内存子系统的带宽