什么是指令重排序?

简介: 什么是指令重排序?

正文


在代码的世界里,指令重排序是一个比较大众的技术,主要是优化书写的源代码执行效率。计算机在执行程序时候,为了提高代码、指令的执行效率,编译器和处理器会对指令进行重新排序,一般分为编译器对于指令的重新排序、指令并行之间的优化、以及内存指令的优化。这么多优化都是保证在单线程的情况下,执行的结果是不变的,下图就是描述整个的指令重排的优化的过程:


9.png


但是,在这里,重排序的先决条件是,重排序后的指令执行不可以影响指令原有所有实现的功能。也就是说单线程环境里确保程序的最终执行的结果和代码顺序执行的结果是一致的。各种指令交替依次执行,由于编译器优化重排序的存在,两个线程中使用的变量能否一致是无法确定的。结果无法预测。相比之下,volatile不能实现原子性的最主要原因是指令的交替执行,无法保证程序执行的最终结果。也就是说volatile是比较丐的一种同步机制。但是为了实现原子性,保证数据的准确性,这个时候就需要加锁才可以实现。比如synchronized重量级、可重入锁,或者采用JUC下面使用AQS实现的轻量级可重入锁。除此之外,指令的重排序也要遵循一般的规则,也就是指令之间数据的依赖性。简单的说,任何变量先定义,后使用,两个数据存在依赖,比如A指令依赖B指令返回的数据,那么无论怎么重新排序,都不会改变B指令在A指令前面执行的这样的顺序。

相关文章
|
监控 负载均衡 算法
构建高效微服务架构的五大核心组件
【4月更文挑战第6天】随着现代业务需求的多样化和复杂性增加,传统的单体应用已无法满足快速迭代与灵活部署的需求。微服务架构应运而生,以其高度模块化、独立部署和可伸缩性成为企业转型的关键。本文聚焦于构建高效微服务架构的核心组件,从服务发现、配置管理、负载均衡、容错处理到服务监控五个方面进行深入剖析,旨在提供一套全面的技术指南以支持后端开发的最佳实践。
|
4月前
|
缓存 NoSQL Java
【📕分布式锁通关指南 11】源码剖析redisson之读写锁的实现
Redisson 的 `RedissonReadWriteLock` 提供了高效的分布式读写锁实现,适用于读多写少的场景。通过 Redis 与 Lua 脚本结合,确保读锁并行、写锁互斥,以及读写之间的互斥,保障了分布式环境下的数据一致性。它支持可重入、自动过期和锁释放机制,提升了系统并发性能与资源控制能力。
111 0
|
数据采集 数据管理 数据挖掘
CDGP|数据治理策略揭秘:因企制宜,实现精准管控新高度
数据治理是指通过制定一系列政策、流程和技术手段,对企业数据进行全面、系统、规范的管理。它不仅能够确保数据的准确性、一致性和安全性,还能提升数据的质量和价值,为企业决策提供有力支持。因此,制定数据治理策略的首要任务是明确其核心价值,确保策略能够服务于企业的整体战略目标。
|
安全 Java Linux
springboot实现黑名单和白名单功能
这篇文章介绍了如何在Spring Boot中实现黑名单和白名单功能,通过创建一个自定义的过滤器类并注册到Spring Boot应用中,以控制基于IP地址的访问权限。
641 1
springboot实现黑名单和白名单功能
|
存储 安全 Java
从入门到精通:Java Map全攻略,一篇文章就够了!
【10月更文挑战第19天】本文介绍了Java编程中重要的数据结构——Map,通过问答形式讲解了Map的基本概念、创建、访问与修改、遍历方法、常用实现类(如HashMap、TreeMap、LinkedHashMap)及其特点,以及Map在多线程环境下的使用和性能优化技巧,适合初学者和进阶者学习。
494 4
|
应用服务中间件 nginx
项目node_modules开发环境变大问题处理
项目node_modules开发环境变大问题处理
436 0
|
JSON Java 数据格式
Java系列之:如何取出嵌套JSON中的数据值
这篇文章介绍了如何在Java中取出嵌套JSON数据值的方法,通过使用`JSONObject`类及其`getJSONObject`和`get`方法来逐步解析和提取所需的数据。
Java系列之:如何取出嵌套JSON中的数据值
|
SQL 安全 数据库
|
缓存 NoSQL Java
Springboot 多级缓存设计与实现
Springboot 多级缓存设计与实现
|
IDE Java 测试技术
为什么Spring和IDEA不推荐使用@Autowired注解,有哪些替代方案?
为什么Spring和IDEA不推荐使用@Autowired注解,有哪些替代方案?
684 1
为什么Spring和IDEA不推荐使用@Autowired注解,有哪些替代方案?