返回顶部
首页 > 资讯 > 后端开发 > Python >Java中volatile防止指令重排
  • 721
分享到

Java中volatile防止指令重排

2024-04-02 19:04:59 721人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录什么是指令重排? 为什么指令重排能够提高性能 volatile是怎么禁止指令重排的? volatile可以防止指令重排,在多线程环境下有时候我们需要使用volat

volatile可以防止指令重排,在多线程环境下有时候我们需要使用volatile来防止指令重排,来保证代码运行后数据的准确性

什么是指令重排?

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

指令重排有以下三个特点:

1.单线程环境下指令重排后可以保证与顺序执行指令的结果一致(就是不进行指令重排的情况)


//原来的执行顺序
a=1;
b=0;
//进行指令重排后执行
b=0;
a=1;

这两个顺序执行的指令结果都是a=1,b=0

2.进行指令重排的时候要考虑指令之间的数据依赖性(某个指令的数据需要根据另一个指令的数据获得)


//原来的执行顺序
a=0;    //指令1
a=10;    //指令2
b=a+1;   //指令3

//进行指令重排后
a=0;        
b=a+1;    
a=10;      

此时两种顺序输出的结果就不一样了,这是因为指令3的数据依赖于指令2,单线程环境下指令重排不会出现这种情况。

3.多线程环境下,多个线程交替执行,由于编译器会进行指令重排,结果无法预测。

为什么指令重排能够提高性能

串行的代码确实会按代码语意正确的执行(就是编写的代码的运行逻辑),但是编译器对于代码本身的优化却并不一定会按实际的代码一步一步的执行,就比如下面这段代码


public void process() {
    int a = 10;  #指令1
    int b = 20;  #指令2
}

代码的执行过程一定是是int a=10然后int b=20,但是代码转换成计算机可以识别的指令可能是指令2,指令1。

我们知道指令的执行可以分为这几步:

  • 取址 IF
  • 译码和取寄存器操作数 ID
  • 执行或者有效地址计算 EX (ALU逻辑计算单元)
  • 存储器访问 MEM
  • 写回 WB (寄存器)

一段代码并不是由单条指令就可以执行完毕的,而是通过流水线技术来执行多条指令。

流水线技术是一种将指令分解为多步,并让不同指令的各步操作重叠,从而实现几条指令并行处理,这样就提高了指令的执行速度

简单来说就是通过指令重排,可以使用流水线技术实现指令的细分,然后实现几条指令的并行处理,从而提高速度

volatile是怎么禁止指令重排的?

这就涉及到一个概念内存屏障(内存栅栏),它是一个cpu指令,有两个作用:

  • 保证某些特定操作的执行顺序
  • 保证某些变量的内存可见性(实现了volatile保证可见性)

编译器和处理器都可以进行指令重排,那么如果我们在程序中插入一条Memery Barrier(内存屏障),那么就会告诉编译器和cpu不能对这条指令进行重排,也就是说通过插入内存屏障,使屏障前后的指令不会进行重排优化,内存屏障还可以强制刷出cpu的缓存,因此cpu上的线程都能读到这些数据的最新版本。

简单来说就是插入内存屏障后告诉cpu和编译器,这个内存屏障前后的指令你不要给我进行重排序

内存屏障分为四种:

StoreStore屏障、StoreLoad屏障、LoadLoad屏障、LoadStore屏障。

  • Load相当于读屏障
  • Store相当于写屏障

到此这篇关于Java中volatile防止指令重排 的文章就介绍到这了,更多相关Java volatile防止指令重排 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java中volatile防止指令重排

本文链接: https://lsjlt.com/news/131754.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java中volatile防止指令重排
    目录什么是指令重排? 为什么指令重排能够提高性能 volatile是怎么禁止指令重排的? volatile可以防止指令重排,在多线程环境下有时候我们需要使用volat...
    99+
    2024-04-02
  • Java中怎么利用volatile防止指令重排
    这篇文章将为大家详细讲解有关Java中怎么利用volatile防止指令重排,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是指令重排计算机在执行程序时,为了提高性能,编译器和处理器一般会进...
    99+
    2023-06-20
  • java中volatile如何禁止指令重排
    在Java中,使用`volatile`关键字可以禁止指令重排。指令重排是指CPU为了提高执行效率而对指令进行重新排序的优化手段。在多...
    99+
    2023-10-09
    java
  • 怎么在java中使用volatile禁止指令重排
    怎么在java中使用volatile禁止指令重排?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Java是什么Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用...
    99+
    2023-06-14
  • java中怎么对指令进行重新排序
    本篇文章给大家分享的是有关java中怎么对指令进行重新排序,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。指令重排序是个比较复杂、觉得有些不可思议的问题,同样是先以例子开头(建议...
    99+
    2023-05-31
    java ava
  • Angular中怎么通过自定义Debounce Click指令防止重复点击
    Angular中怎么通过自定义Debounce Click指令防止重复点击,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。该指令将处理在指定...
    99+
    2024-04-02
  • vue指令防止按钮连点解析
    目录vue指令防止按钮连点钩子函数钩子函数参数实现vue防连点,重复点击局部注册全局注册vue指令防止按钮连点 在开发中,经常会遇到客户反馈一个数据提交了两边的情况,这种情况不能够去...
    99+
    2024-04-02
  • vue指令怎么防止按钮连点
    这篇文章主要介绍“vue指令怎么防止按钮连点”,在日常操作中,相信很多人在vue指令怎么防止按钮连点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”vue指令怎么防止按钮连点”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-30
  • java如何停止运行指令
    在Java中,可以使用System.exit()方法来停止Java程序的运行。此方法以一个整数作为参数,用于表示程序的退出状态。通常...
    99+
    2023-10-10
    java
  • java后端怎么防止重复提交
    在Java后端防止重复提交的方式有以下几种:1. 生成唯一的表单标识符(token):在表单页面中生成一个唯一的标识符,并将其存储在...
    99+
    2023-09-04
    java
  • java怎么防止重复请求数据
    有以下几种方法可以防止重复请求数据: 前端防重复提交:前端可以通过禁用提交按钮或者添加遮罩层等方式,在接收到请求后禁止用户再次提...
    99+
    2023-10-25
    java
  • java指令重排现象两个阶段的示例分析
    这篇文章给大家分享的是有关java指令重排现象两个阶段的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。编译期指令重排解释型语言是在运行期间执行编译+运行动作,所以运行效率较编译型语言低。Java既可以作为...
    99+
    2023-06-29
  • Java指令重排在多线程环境下怎么解决
    本篇内容介绍了“Java指令重排在多线程环境下怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、序言指令重排在单线程环境下有利于提高...
    99+
    2023-06-30
  • Java注解方式之防止重复请求
    目录一、 前情提要二、技术设计2.1 库表设计2.2 业务逻辑2.3 代码编写2.4 测试2.5 问题所在三、解决方案四 、唠唠4.1 项目4.2 redis服务4.3 其他问题自定...
    99+
    2024-04-02
  • Java指令重排在多线程环境下的解决方式
    目录一、序言二、问题复原(一)关联变量1、结果预测2、指令重排(二)new创建对象1、解析创建过程2、重排序过程分析三、应对指令重排(一)AtomicReference原子类(二)v...
    99+
    2024-04-02
  • Java指令重排序在多线程环境下如何处理
    这篇文章主要讲解了“Java指令重排序在多线程环境下如何处理”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java指令重排序在多线程环境下如何处理”吧!一、序言指令重排在单线程环境下有利于提...
    99+
    2023-06-30
  • MySQL中怎么防止数据重复
    MySQL中怎么防止数据重复,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。很多时候在日常的项目中,有些数据是不允许重复的,例如用户信息中的登陆...
    99+
    2024-04-02
  • html中怎么防止重复提交
    这篇文章将为大家详细讲解有关html中怎么防止重复提交,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 1、禁掉提交按钮。表单提交后使用Javascript使提交按钮di...
    99+
    2024-04-02
  • Java指令重排序在多线程环境下的处理方法
    目录一、序言二、问题复原(一)关联变量1、结果预测2、指令重排(二)new创建对象1、解析创建过程2、重排序过程分析三、应对指令重排(一)AtomicReference原子类(二)v...
    99+
    2024-04-02
  • java定时任务怎么防止重复执行
    在Java中,可以使用定时任务来执行一段代码,但有时候我们希望在任务完成之前不再重复执行。有几种方法可以防止定时任务重复执行:1. ...
    99+
    2023-10-09
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作