美文网首页Java并发编程程序员oo
Java内存模型-指令重排序&顺序一致性

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

作者: markfork | 来源:发表于2018-05-03 22:28 被阅读111次

章节目录

  • 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参考顺序一致性内存模型,(但不能完全实现,比如在非同步多线程程序下),来对正确同步的多线程程序做了如下保证-程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同,但正确同步的多线程程序在执行过程中可以对临界区内不存在数据依赖的指令行进行重排序,以在保证执行结果正确的情况下通过指令重排序对程序运行性能做提升。

相关文章

  • 并发编程艺术-3

    本文主要简单介绍Java 内存模型的基础和相关概念,重排序和顺序一致性内存模型,同步原语 synchronized...

  • 巨人大哥谈Java工程师高手之路

    JVM方面 JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性...

  • jvm与Java的区别关联性

    JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性、volat...

  • java框架工程结构总结

    JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性、volat...

  • 第三章 Java内存模型之顺序一致性⑤

    接上一章Java内存模型之重排序,我们来了解下顺序一致性。 学习完重排序之后,顺序一致性这个概念,也就很好懂了。 ...

  • 阿里P7学习路线图

    一、基础篇JVMJVM内存结构堆、栈、方法区、直接内存、堆和栈区别Java内存模型内存可见性、重排序、顺序一致性、...

  • Java成神之路

    一、基础篇JVMJVM内存结构堆、栈、方法区、直接内存、堆和栈区别 Java内存模型内存可见性、重排序、顺序一致性...

  • Java指令重排序

    Java指令重排序Java内存模型允许编译器和处理器对指令重排序以提高运行性能,并且只会对不存在数据依赖性的指令重...

  • java并发编程(四)

    java多线程编程(四) 引言: 内存模型的基础----内存模型相关的基本概念 java内存模型中的顺序一致性--...

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

    章节目录 1.重排序定义 2.数据依赖性 3.as-if-serial语义 4.程序顺序规则 5.JMM 参考 顺...

网友评论

本文标题:Java内存模型-指令重排序&顺序一致性

本文链接:https://www.haomeiwen.com/subject/uvolrftx.html