`
ITChaser
  • 浏览: 7807 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

[JMM] 变量Reordering的含义

阅读更多
本文的思想来源于:
Jeremy Manson and Brian Goetz, 《JSR 133 (Java Memory Model) FAQ》, February 2004, http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization

(1) 在一些情况下,对程序变量(对象实例变量、静态变量、数组元素)进行access的时候,会发现
access的执行顺序与程序中所指定的顺序并不一致。只要不改变程序的语义,编译器为了进行程
序的优化可以自由地reorder指令(instructions)。在运行期,处理器也可能以不同的顺序去执
行指令:数据可能会以不同于程序中所指定的顺序在处理器寄存器、处理器缓存以及住内存之间
移动。

(2) 下面举例说明:

  Class Reordering {
		  int x = 0, y = 0;
		  public void writer() {
		    x = 1;
		    y = 2;
		  }
		
		  public void reader() {
		    int r1 = y;
		    int r2 = x;
		  }
		}		


假设有两个线程分别执行上面的示例程序代码中的writer和reader方法。在writer方法的程序中,
x被指定在y之前进行赋值。但是由于对y的赋值并不依赖于x的值,因此编译器可以reorder这些操
作。另外,执行writer线程的处理器也完全可以先将cache中y的值写回内存,然后再将x的值写回内存。
在两个操作的中间(y的值已经被写回内存,但是x的值尚未被写回内存的时候),执行reader方法
的线程得到的结果便是 r1 = y的真实值,但是 r2 = 0,而非x的真实值。

(3) 可能进行reorder的地方包括:编译器、JIT JVM、处理器缓存。

(4) Reorder的影响。在单线程的情况下,程序不必去关注指令的真实执行顺序,同时也不必在意
reordering的影响。然而,在多线程的情况下,如果程序没有被正确地synchronized,一个线程便
能够观测到reordering对其他线程的影响,即该线程可能会透明地看到其他线程的变量acess过程与
程序中specified不同。
分享到:
评论

相关推荐

    Java内存模型详解JMM.docx

    Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)中的一种内存模型,它描述了程序中各个变量之间的关系,以及在实际计算机系统中将变量存储到内存和从内存中取出变量这样的底层细节。JMM允许编译器和缓存...

    三问JMM--有关JVM内存模型的PPT

    JMM (Java Memory Model) 是Java内存模型的简称,它主要关注的是Java程序中各种变量(线程共享变量)的访问规则,以及在并发环境中这些变量的内存一致性问题。为了更好地理解JMM的作用,我们需要先简单回顾一下Java...

    深入Java内存模型-JMM

    JMM的主要目标是定义程序中各个变量的访问规则,以及在并发过程中如何建立、发布和使用这些变量的内存一致性模型。 1. **线程局部变量与共享变量** - **线程局部变量**:每个线程都有自己独立的副本,不会与其他...

    jmm模型ppt基本概念介绍

    Java内存模型(Java Memory Model,JMM)是Java虚拟机(JVM)中的一种抽象概念,描述了一组规则或规范,定义了程序中各个变量的访问方式。JMM围绕原子性、有序性、可见性展开,确保了Java程序在多线程环境下的正确...

    01-并发编程之深入理解JMM&并发三大特性(一).pdf

    在深入理解Java内存模型(JMM)及并发三大特性方面,我们需要先建立对多线程、共享内存模型、可见性、有序性和原子性的基础概念。Java内存模型是Java并发编程的核心,它定义了共享变量在多线程环境中的行为规则和...

    最新版JMM模拟器下载不后悔

    Java内存模型(JMM,Java Memory Model)是Java平台中用于定义线程间如何共享变量以及如何同步操作的重要概念。最新版的JMM模拟器提供了一种可视化的方式,帮助开发者理解并模拟Java内存模型的工作机制,这对于理解...

    深入理解JMM

    Java内存模型(JMM, Java Memory Model)是Java平台中用于定义如何在多线程环境下共享数据的一种规范。它规定了线程之间的交互、数据的可见性以及如何避免数据的不一致性等问题。JMM的存在主要是为了解决处理器缓存...

    手机java模拟器JMM3.0

    Java模拟器JMM3.0是一款专为智能手机设计的软件,旨在为用户提供Java应用程序和游戏的支持。在智能手机领域,Java由于其跨平台性和强大的功能,曾经是开发移动应用的主流选择,尤其是对于早期的非智能手机。JMM3.0...

    美国钻石JMM-512-V512技术手册(英文).rar

    《美国钻石JMM-512-V512技术手册》是针对一款专业级音频处理设备的详尽指南,主要面向工程师、技术人员以及对音频系统有深入兴趣的用户。这份手册详细介绍了JMM-512-V512的功能、操作方法以及其在音频制作中的应用。...

    java内存模型(JMM).docx

    JMM处理的主要问题是内存的可见性和一致性,它定义了线程如何与主内存交互以及如何共享变量。 在计算机内存模型中,每个CPU都有高速缓存,而所有CPU共享主内存。高速缓存的存在提高了数据读取和写入的速度,但同时...

    Java内存模型(JMM)深度解析:原理、特性与代码实践

    Java内存模型(Java Memory Model,简称JMM)是Java并发编程中的核心概念,它定义了Java程序中多线程间共享变量的访问规则。理解JMM对于编写正确、高效的并发程序至关重要。本文将深入探讨JMM的原理、特性以及如何在...

    JVM的基础和调优【JMM 内存结构 GC OOM 性能调优 ThreadLocal】

    JMM 决定一个线程对共享变量的写入何时对另一个线程可见,从抽象的角度来看, JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(Main Memory)中, 每个线程都有一个私有的本地内存(local ...

    java内存模型JMM(Java Memory Model)1

    为了实现这一点,JMM规定线程在解锁(unlock)前必须将共享变量的更新写回主内存,而在加锁(lock)前需要从主内存获取最新的变量值。 3. **原子性**:JMM确保某些操作(如读写变量)是不可分割的,即在其他线程...

    JMM&JSR;.rar

    Java程序是需要运行在Java虚拟机上面的,Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的...

    sgys108jmm1.apk

    sgys108jmm1.apk

    3 JMM内存模型.md,学习代码

    Java内存模型(JMM,Java Memory Model)是Java平台中用于定义线程间共享变量的访问规则的一个抽象概念,它规定了线程如何与主内存交互,以及对共享变量的操作顺序。在Java并发编程中,理解JMM至关重要,因为它直接...

    并发编程之JMM&synchronized&volatile详解.pdf

    JMM规定了 volatile 变量、synchronized 关键字以及其他并发原语的行为。 【volatile关键字】在Java中,volatile是一个关键字,用于标记变量为共享变量,确保所有线程都能看到该变量的最新值。当一个变量被声明为...

    14、深入理解并发可见性、有序性、原子性与JMM内存模型

    深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发可见性、有序性、原子性与JMM内存模型深入理解并发...

    JMM内存模型图

    Java运行时内存模型图

    笔记-9、JMM和底层实现原理1

    JMM规定了所有线程都共享一个主内存,而每个线程拥有自己的工作内存,其中保存了主内存中变量的副本。线程对变量的读写操作都在其工作内存中进行,然后通过特定的同步机制(如synchronized或volatile)将变更同步回...

Global site tag (gtag.js) - Google Analytics