Java内存模型-指令重排序&顺序一致性

简介: 章节目录1.重排序定义2.数据依赖性3.as-if-serial语义4.程序顺序规则5.JMM 参考 顺序一致性内存模型的实践规范1.重排序定义重排序是指编译器和处理器为优化程序性能而对指令序列重新排序的一种手段。

章节目录

  • 1.重排序定义
  • 2.数据依赖性
  • 3.as-if-serial语义
  • 4.程序顺序规则
  • 5.JMM 参考 顺序一致性内存模型的实践规范

1.重排序定义

重排序是指编译器和处理器为优化程序性能而对指令序列重新排序的一种手段。

2.数据依赖性

如果两个操作访问同一个变量,且两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。

如下表所示,是我们常见的数据依赖性场景:

操作模式 代码示例 说明
store->load a=1;
b=a;
写一个变量后,再读这个位置
store->store a=1;
a=2
写一个变量之后,再写这个变量
load->store a=b;
b=1
读一个变量之后,再写这个变量

注意:
上述指令重排序之后,执行结果就会发生变化,所以编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。仅针对于单个处理器中执行的指令序列和单个线程中执行的操作。

3.as-if-serial 语义

对于不存在数据依赖性的操作可以做指令重排序。as-if-serial语义把单线程程序保护了起来。

4.程序顺序规则

如果A happens-before B,注意happens-before定义的不是A,B操作执行的顺序是A先B后,,而是A操作的结果对B操作的结果可见,且A操作的结果按顺序排在B操作结果之前,所以进行指令重排序必须保证的前提是不改变程序执行结果。

5.JMM 参考 顺序一致性内存模型的实践规范

  • 1.JMM采用共享内存模型通过通过控制共享内存与每个线程本地内存之间的交互,来提供内存可见性保证。
  • 2.JMM通过指令重排序来优化程序执行性能,但不正确的重排序会破坏多线程程序的语义,程序运行结果出现非预想的情况。
  • 3.JMM参考顺序一致性内存模型,(但不能完全实现,比如在非同步多线程程序下),来对正确同步的多线程程序做了如下保证-程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同,但正确同步的多线程程序在执行过程中可以对临界区内不存在数据依赖的指令行进行重排序,以在保证执行结果正确的情况下通过指令重排序对程序运行性能做提升。
目录
相关文章
|
12天前
|
存储 IDE Java
java设置栈内存大小
在Java应用中合理设置栈内存大小是确保程序稳定性和性能的重要措施。通过JVM参数 `-Xss`,可以灵活调整栈内存大小,以适应不同的应用场景。本文介绍了设置栈内存大小的方法、应用场景和注意事项,希望能帮助开发者更好地管理Java应用的内存资源。
27 4
|
18天前
|
Java Shell 数据库
【YashanDB 知识库】kettle 同步大表提示 java 内存溢出
【问题分类】数据导入导出 【关键字】数据同步,kettle,数据迁移,java 内存溢出 【问题描述】kettle 同步大表提示 ERROR:could not create the java virtual machine! 【问题原因分析】java 内存溢出 【解决/规避方法】 ①增加 JVM 的堆内存大小。编辑 Spoon.bat,增加堆大小到 2GB,如: if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms512m" "-Xmx512m" "-XX:MaxPermSize=256m" "-
|
2月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
175 20
|
3月前
|
存储 监控 算法
Java内存管理的艺术:深入理解垃圾回收机制####
本文将引领读者探索Java虚拟机(JVM)中垃圾回收的奥秘,解析其背后的算法原理,通过实例揭示调优策略,旨在提升Java开发者对内存管理能力的认知,优化应用程序性能。 ####
69 0
|
3月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
3月前
|
安全 Java 程序员
深入理解Java内存模型与并发编程####
本文旨在探讨Java内存模型(JMM)的复杂性及其对并发编程的影响,不同于传统的摘要形式,本文将以一个实际案例为引子,逐步揭示JMM的核心概念,包括原子性、可见性、有序性,以及这些特性在多线程环境下的具体表现。通过对比分析不同并发工具类的应用,如synchronized、volatile关键字、Lock接口及其实现等,本文将展示如何在实践中有效利用JMM来设计高效且安全的并发程序。最后,还将简要介绍Java 8及更高版本中引入的新特性,如StampedLock,以及它们如何进一步优化多线程编程模型。 ####
59 0
|
3月前
|
存储 算法 Java
Java内存管理深度解析####
本文深入探讨了Java虚拟机(JVM)中的内存分配与垃圾回收机制,揭示了其高效管理内存的奥秘。文章首先概述了JVM内存模型,随后详细阐述了堆、栈、方法区等关键区域的作用及管理策略。在垃圾回收部分,重点介绍了标记-清除、复制算法、标记-整理等多种回收算法的工作原理及其适用场景,并通过实际案例分析了不同GC策略对应用性能的影响。对于开发者而言,理解这些原理有助于编写出更加高效、稳定的Java应用程序。 ####
|
8月前
|
存储 安全 Java
Java面试题:请解释Java内存模型(JMM)是什么,它如何保证线程安全?
Java面试题:请解释Java内存模型(JMM)是什么,它如何保证线程安全?
136 13
|
8月前
|
安全 Java
Java面试题:解释synchronized关键字在Java内存模型中的语义
Java面试题:解释synchronized关键字在Java内存模型中的语义
68 1
|
8月前
|
Java 程序员 编译器
Java面试题:解释Java内存模型(JMM)是什么,它为何重要?
Java面试题:解释Java内存模型(JMM)是什么,它为何重要?
96 2

热门文章

最新文章