volatile禁止指令重排序_volatile int

volatile禁止指令重排序_volatile intvolatile禁止指令重排JMM要求有序性计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一把分为以下3种单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致.(单线程不用关心指令重排)处理器在进行重新排序是必须要考虑指令之间的数据依赖性多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测源码写的顺序不见得和编译的指令顺序一样例子1比如源码如下publicvoidmySort(){intx

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

volatile禁止指令重排

JMM要求有序性

计算机在执行程序时,为了提高性能,编译器和处理器常常会做指令重排,一把分为以下3种

在这里插入图片描述

单线程环境里面确保程序最终执行结果和代码顺序执行的结果一致.(单线程不用关心指令重排)
处理器在进行重新排序是必须要考虑指令之间的数据依赖性

多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测

源码写的顺序不见得和编译的指令顺序一样

例子1

比如源码如下

public void mySort(){ 
   
    int x=11;//语句1
    int y=12;//语句2
    x=x+5;//语句3
    y=x*x;//语句4
}

但是其中编译后的指令顺序可能为:

1234
2134
1324

问题:
请问语句4 可以重排后变成第一条码?
答:存在数据的依赖性 ,语句4 没办法排到第一个

正常情况下指令不重排,不是每次指令都会重排

例子2
int a ,b ,x,y=0;
线程1	线程2
x=a;	y=b;
b=1;	a=2;
结果 :x=0 y=0	

如果编译器对这段代码进行执行重排优化后,可能出现下列情况:
线程1	线程2
b=1;	a=2;
x=a;	y=b;
	
结果:  x=2 y=1	
 这也就说明在多线程环境下,由于编译器优化重排的存在,两个线程使用的变量能否保持一致是无法确定的.

例子3

在这里插入图片描述

两个线程分别执行method1 和method2

多线程环境中线程交替执行,由于编译器优化重排的存在,两个线程使用的变量能否保持一致性是无法确定的,结果无法预测

假设线程1首先执行method1:

默认是:

a=1;
flag=true;

因为a与flag不存在数据依赖性,很可能出现指令重排,

flag=true;
a=1;

在这种情况下,若执行完flag=true就被线程2抢走cpu执行method2,执行了if条件体内的命令,a成为5 就会和不指令重排的结果(6)不一致。

所以指令重排会造成值不一致,所以有时候我们需要 volatile禁止指令指令重排

总结(了解)

在这里插入图片描述

在这里插入图片描述

PS:学习笔记,资源:尚硅谷,周阳

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180767.html原文链接:https://javaforall.net

(0)
上一篇 2022年10月18日 上午7:46
下一篇 2022年10月18日 上午7:46


相关推荐

  • python中copy()和deepcopy()详解

    python中copy()和deepcopy()详解参考文章 http iaman actor blog 2016 04 17 copy in python 首先直接上结论 我们寻常意义的复制就是深复制 即将被复制对象完全再复制一遍作为独立的新个体单独存在 所以改变原有被复制对象不会对已经复制出来的新对象产生影响 而浅复制并不会产生一个独立的对象单独存在 他只是将原有的数据块打上一个新标签 所以当其中一个标签被

    2026年3月19日
    2
  • buildroot 树莓派_树莓派忘记root密码

    buildroot 树莓派_树莓派忘记root密码下载源码wgethttps://buildroot.uclibc.org/downloads/buildroot-2016.11.2.tar.gz解压tar-xvfbuildroot-2016.11.2.tar.gz配置将入config目录查看相应配置文件cdconfigsls查找到树莓派相关配置文件进行配置makeraspberrypi0_defconfig配置选…

    2022年10月9日
    4
  • compound extremes_conscientiousness

    compound extremes_conscientiousnessextremeComponents是一个好用的表格插件,可以方便的对分页,导出excel等进行操作并且可以和任何框架进行集成,包括springmvc,struts,struts2等

    2022年8月20日
    14
  • java打印数组_Java中打印数组的三种方式

    java打印数组_Java中打印数组的三种方式说明:System.out.println(array);这样是不行的,这样打印是的是数组的首地址。Arrays.toString(array);一维数组定义一个数组:int[]array={1,2,3,4,5};传统的for循环:for(inti=0;i{System.out.println(a[i]);}foreach增强循环:for(inta:array)Sys…

    2022年6月5日
    36
  • c语言dlsym函数_dlsym

    c语言dlsym函数_dlsym2019独角兽企业重金招聘Python工程师标准>>>…

    2025年5月31日
    6
  • mac安装wget命令_安装mac系统

    mac安装wget命令_安装mac系统wget是一个从网络上自动下载文件的自由工具,支持通过HTTP、HTTPS、FTP三个最常见的TCP/IP协议下载,并可以使用HTTP代理。“wget”这个名称来源于“WorldWideWeb”与“get”的结合。所谓自动下载,是指wget可以在用户退出系统的之后在继续后台执行,直到下载任务完成。Mac安装wget官网下载包wget1.8.tar.gz包:http://ftp.gnu.org/gnu/wget/解压到想安装的路径打开终端进入wget解压的路径依次执

    2022年10月16日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号