译者:Alex

在很多情况下,访问一个程序变量(对象实例字段,类静态字段和数组元素)可能会使用不同的顺序执行,而不是程序语义所指定的顺序执行。编译器能够自由的以优化的名义去改变指令顺序。在特定的环境下,处理器可能会次序颠倒的执行指令。数据可能在寄存器,处理器缓冲区和主内存中以不同的次序移动,而不是按照程序指定的顺序。

例如,如果一个线程写入值到字段a,然后写入值到字段b,而且b的值不依赖于a的值,那么,处理器就能够自由的调整它们的执行顺序,而且缓冲区能够在a之前刷新b的值到主内存。有许多潜在的重排序的来源,例如编译器,JIT以及缓冲区。

编译器,运行时和硬件被期望一起协力创建好像是顺序执行的语义的假象,这意味着在单线程的程序中,程序应该是不能够观察到重排序的影响的。但是,重排序在没有正确同步了的多线程程序中开始起作用,在这些多线程程序中,一个线程能够观察到其他线程的影响,也可能检测到其他线程将会以一种不同于程序语义所规定的执行顺序来访问变量。

大部分情况下,一个线程不会关注其他线程正在做什么,但是当它需要关注的时候,这时候就需要同步了。

原文

What is meant by reordering?

There are a number of cases in which accesses to program variables (object instance fields, class static fields, and array elements) may appear to execute in a different order than was specified by the program. The compiler is free to take liberties with the ordering of instructions in the name of optimization. Processors may execute instructions out of order under certain circumstances. Data may be moved between registers, processor caches, and main memory in different order than specified by the program.

For example, if a thread writes to field a and then to field b, and the value of b does not depend on the value of a, then the compiler is free to reorder these operations, and the cache is free to flush b to main memory before a. There are a number of potential sources of reordering, such as the compiler, the JIT, and the cache.

The compiler, runtime, and hardware are supposed to conspire to create the illusion of as-if-serial semantics, which means that in a single-threaded program, the program should not be able to observe the effects of reorderings. However, reorderings can come into play in incorrectly synchronized multithreaded programs, where one thread is able to observe the effects of other threads, and may be able to detect that variable accesses become visible to other threads in a different order than executed or specified in the program.

Most of the time, one thread doesn’t care what the other is doing. But when it does, that’s what synchronization is for.

java重排序_Java内存模型FAQ(四)重排序意味着什么?相关推荐

  1. java锁上升_Java内存模型FAQ(十一)新的内存模型是否修复了双重锁检查问题?...

    臭名昭著的双重锁检查(也叫多线程单例模式)是一个骗人的把戏,它用来支持lazy初始化,同时避免过度使用同步.在非常早的JVM中,同步非常慢,开发人员非常希望删掉它.双重锁检查代码如下: // doub ...

  2. Java并发篇_Java内存模型

    在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题.那么它们产生的原因和在Java中解决的办法又是什么呢? 一.内存模型的相关概念 ​ 计算机在执行程序时,每条指令都是在CP ...

  3. java model 原则_java内存模型(Java Memeory Model)

    1.java内存模型的重要目标是定义程序中各个访问变量的访问规则,即在虚拟机中将变量存储到内存,和从内存中取出变量的低层细节:这里所说的变量主要包括实例字段,静态字段,构成数组对象的元素不包括局部变量 ...

  4. java内存规范_Java内存模型-jsr133规范介绍

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  5. Java 并发编程解析 | 如何正确理解Java领域中的内存模型,主要是解决了什么问题?

    写在开头 这些年,随着CPU.内存.I/O 设备都在不断迭代,不断朝着更快的方向努力.在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度差异.CPU 和内存的速度差异可以形象地描述为:C ...

  6. Java 并发编程解析 , 如何正确理解Java领域中的内存模型

    这些年,随着CPU.内存.I/O 设备都在不断迭代,不断朝着更快的方向努力.在这个快速发展的过程中,有一个核心矛盾一直存在,就是这三者的速度差异.CPU 和内存的速度差异可以形象地描述为:CPU 是天 ...

  7. 深入理解Java虚拟机:jvm内存模型jdk1.8

    深入理解Java虚拟机:jvm内存模型jdk1.8 一.程序计数器 使用PC寄存器存储字节码指令地址有什么作用?为什么使PC寄存器记录当前线程的执行地址? PC寄存器为什么会被设定为线程私有? 二.J ...

  8. Java虚拟机中的内存模型?JSP常用的动作标签及作用? 如何防止表单重复提交问题? JSP四大作用域及请求范围? 分别说出http,https,ftp,talnet的默认端口?

    文章目录 一 ,Java虚拟机中的内存模型JVM? 1,Java堆 2,方法区 3,Java栈 4,本地方法栈 问题扩展: 二 , JSP常用的动作标签及作用 (1)问题分析: (2)核心答案讲解: ...

  9. Java虚拟机学习 - 体系结构 内存模型(转载)

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内 ...

最新文章

  1. GOROOT、GOPATH
  2. 怎么修改CSDN上传图片水印的字体大小?(去水印)
  3. mysql在可视化软件navicat中如何解决中文乱码问题
  4. Android 笔记 android 7.0 单独编译framwork不生效的解决
  5. 分隔符有哪些_Python有哪些常用的标准库?Python基础教程,常用标准库(一)
  6. Windows Phone开发(40):漫谈关键帧动画之中篇 转:http://blog.csdn.net/tcjiaan/article/details/7559978...
  7. Linux下TCP循环接收数据的方式
  8. 让应用通过苹果审核出人头地的10个方法
  9. VMware ESXi 6.7 安装LEDE
  10. 服务器专用影子系统,试试最牛X的影子系统!瞬间创建N个账号
  11. endnote引用格式自定义
  12. 联想服务器修改ip地址,联想 lenove 3750 M4服务器更改启动项和管理口IP
  13. 2 二十五项反措--防止火灾事故
  14. 基金常用的分析指标:跟踪误差率、信息比率、夏普比率到底是什么意思?
  15. jQuery获取元素属性值为undefined
  16. 麦克马斯特大学计算机的强项,麦克马斯特大学什么专业最好?
  17. 微信开发工具BUG(漏洞),魔法加法
  18. 4k分辨率是多少(真4k与假4k区别)
  19. 【自我管理】我们应该如何对待工作
  20. 采集存储板第218篇:基于5VFX70T的3U VPX 光纤数据采集存储板

热门文章

  1. JavaOne 2012:使用HTML5和Java构建移动应用程序
  2. IntelliJ IDEA for Mac 如何取消双击shift键打开全局搜索弹窗
  3. java 聚合_Java聚合
  4. 如何打开笔记本电脑的摄像头_Win8系统笔记本电脑摄像头无法使用的解决办法...
  5. python模块使用_一文让你学会所有的python模块使用
  6. 【技术解决方案】GitHub本地仓库管理与远程仓库管理
  7. 【WebRTC---进阶篇】(六)SELECT网络模型
  8. pcb板材的tg是什么_做到这6点,PCB过回焊炉不会出现板弯及板翘!
  9. C语言边角料:结构体中指针类型的成员变量,它的类型重要吗?
  10. python输入代码如何清除_Bug清除手册-代码书写规范与基本使用(Python)