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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Redis布隆过滤器原理及应用场景「建议收藏」

    Redis布隆过滤器原理及应用场景「建议收藏」1、布隆过滤器是什么?(判断某个key一定不存在)本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构特点是高效地插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。相比于传统的List、Set、Map等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。使用:1.布隆过滤器在NoSQL数据库领域中应用的非常广泛2….

    2022年9月28日
  • 2017 cinemachine[通俗易懂]

    2017 cinemachine[通俗易懂]只有2017以上才可以使用~导入Assetstore中的cinemachine,会在上方显示cinemachine。每创建一个虚拟摄像机,就会在主摄像机下创建组件cinemachineBrain;虚拟摄像机的solo可以理解为把当前虚拟摄像机权重设置最高便于修改。cinemachineBrain属性:showdebugText会打印当前是哪个摄像机在执…

    2022年5月23日
  • xshell的安装和使用_git详细教程

    xshell的安装和使用_git详细教程1、Xshell6的安装废话不多说直接上链接:链接:https://pan.baidu.com/s/1WCOxkdhLIZj7yLakWu4Tdw提取码:t3ak2、了解Xshell及其使用2.1、Xshell是什么东西?首先我们要知道Xshell是用来干什么的。Xshell其实就是一个远程终端工具,它可以将你的个人pc(个人电脑)和你在远端的机器连接起来,通过向Xshell输入命令然后他通过网络将命令传送给远端Linux机器然后远端的Linux机器将其运行结果通过网络传回个人电脑。.

    2022年9月8日
  • 【数学建模】MATLAB应用实战系列(九十)-变异系数法应用案例(附MATLAB和Python代码)「建议收藏」

    【数学建模】MATLAB应用实战系列(九十)-变异系数法应用案例(附MATLAB和Python代码)「建议收藏」前言以下为博主为大家精心准备的人工智能&算法精品专栏,需要的小伙伴可自行订阅深度学习100例全系列详细教程深度学习算法原理介绍及应用案例tensorflow从入门到精通100讲深度学习框架TensorFlow的应用案例手把手教你ML机器学习算法源码全解析机器学习算法解析及应用案例数据挖掘算法解析指南数据挖掘算法原理解析及应用案例数据结构常见算法原理讲解数据结构算法原理解析及应用人工智能AI实战系列代码全解析图像处理、自然语言处理实战案例解析变异系…

    2022年5月3日
  • Java中static作用及用法详解「建议收藏」

    Java中static作用及用法详解「建议收藏」static是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在。这样做有什么意义呢?在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是用static修饰的成员可以通过类名加“.”进行直接访问。

    2022年7月8日
  • 初识CDN加速

    初识CDN加速

    2021年8月21日

发表回复

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

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