在执行程序时为了提升性能,提升并行度,编译器和处理器经常会对指令作重排序。重排序分三种类型:java

编译器优化的重排序。编译器在不改变单线程程序语义的前提下,能够从新安排语句的执行顺序。

指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。若是不存在数据依赖性,处理器能够改变语句对应机器指令的执行顺序。

内存系统的重排序。因为处理器使用缓存和读/写缓冲区,这使得加载和存储操做看上去多是在乱序执行。

问题:重排序均可能会致使多线程程序出现内存可见性问题程序员

1)编译器优化的重排序。编译器在不改变单线程程序语义的前提下,能够从新安排语句的执行顺序。缓存

2)指令级并行的重排序。处理器多条指令重叠执行,改变语句对应机器指令的执行顺序(处理器重排)多线程

3)内存系统的重排序。处理器使用缓存和读/写缓冲区,这使得加载和存储操做看上去多是在乱序执行(处理器重排)性能

举例:处理器对内存的读/写操做的执行顺序,不必定与内存实际发生的读/写操做顺序一致,致使重排序致使内存可见性问题优化

(处理器使用写缓冲区来临时保存向内存写入的数据:避免因为处理器停顿下来等待向内存写入数据而产生的延迟spa

以批处理的方式刷新写缓冲区,以及合并写缓冲区中对同一内存地址的屡次写,能够减小对内存总线的占用)线程

假设处理器A和处理器B按程序的顺序并行执行内存访问,最终却可能获得x = y = 0的结果3d

第一步执行A1 B1blog

第二步执行A2 B2,此时已获得x=b=0 y=a=0

第三步执行A3 B3

执行完A3,A1才算执行完,A1 A2重排序了

JMM经过禁止特定类型的编译器重排序和处理器重排序,为程序员提供一致的内存可见性保证

JMM的编译器重排序规则会禁止特定类型的编译器重排序

java编译器在生成指令序列时,插入特定类型的内存屏障指令来禁止特定类型的处理器重排序

java并发排序_Java并发(三):重排序相关推荐

  1. java内存 海子_Java并发编程:从根源上解析volatile关键字的实现

    Java并发编程:volatile关键字解析 1.解析概览 内存模型的相关概念 并发编程中的三个概念 Java内存模型 深入剖析volatile关键字 使用volatile关键字的场景 2.内存模型的 ...

  2. Java内存模型深度解析:重排序 --转

    原文地址:http://www.codeceo.com/article/java-memeory-2.html 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间 ...

  3. Java并发编程的艺术(二)——重排序

    当我们写一个单线程程序时,总以为计算机会一行行地运行代码,然而事实并非如此. 什么是重排序? 重排序指的是编译器.处理器在不改变程序执行结果的前提下,重新排列指令的执行顺序,以达到最佳的运行效率. 重 ...

  4. java升序问题_JAVA并发理解之重排序问题

    首先我们先来了解一下什么是重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段. 从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如下图所示 上述的1 ...

  5. java计算时间差_JAVA并发编程三大Bug源头(可见性、原子性、有序性),彻底弄懂...

    原创声明:本文转载自公众号[胖滚猪学编程]​ 某日,胖滚猪写的代码导致了一个生产bug,奋战到凌晨三点依旧没有解决问题.胖滚熊一看,只用了一个volatile就解决了.并告知胖滚猪,这是并发编程导致的 ...

  6. java并发排它锁_Java并发编程进阶——锁(解析)

    一.锁是什么 java开发中进行并发编程时针对操作同一块区域时,如果不加锁会出现并发问题,数据不是自己预计得到的值.我觉得有点像mysql事务中脏读.不可重复读.幻读的问题.加锁的目的是为了保证同一时 ...

  7. java并发队列_Java并发教程–阻塞队列

    java并发队列 如第3部分所述,Java 1.5中引入的线程池提供了核心支持,该支持很快成为许多Java开发人员的最爱. 在内部,这些实现巧妙地利用了Java 1.5中引入的另一种并发功能-阻塞队列 ...

  8. java逸出_Java并发编程 - 对象的共享

    编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理.同步代码块和同步方法可以确保以原子的方式执行操作,同步还有另一个重要的方面:内存可见性. 可见性 为了确保多个线程之间对内存 ...

  9. java动态同步_java并发基础-Synchronized

    基础使用 基本上Java程序员都简单的了解synchronized的使用: 无非就是用在多线程环境下的同步. 看如下简单的例子: publicclassUnsafeCounter{ privatein ...

最新文章

  1. Android 常见工具类封装
  2. 使用svn进行版本控制
  3. Glide-源码分析(三)
  4. scipy.stats —— 概率、随机变量与分布
  5. ASPNetCore MVC ModelValidation-ajax
  6. 20171103_Python学习三周五次课
  7. Java异步NIO框架Netty实现高性能高并发
  8. xxnet 360浏览器设置
  9. IPv6技术精要--第12-13章 ICMPv6和邻居发现协议(ND协议)
  10. 2022-04- 聂卫平围棋道场-小汪小喵学围棋
  11. SHELL 内置变量
  12. 电驴 链接不到服务器
  13. 收集了几个h5案例 与大家分享一下
  14. html和cs、js、jq 基础用法
  15. 人教版数学课本插画暴露出的问题
  16. FPGA中高时钟频率计数器设计
  17. java Date类型:24小时制和12小时制
  18. 遍历Java中的列表
  19. 结构体中的函数指针(c语言里一种思想)
  20. pyinstaller打包前后os.path.abspath(__file__)和os.path.realpath(sys.executable)的区别

热门文章

  1. 文献记录(part49)--极大熵聚类算法的收敛性定理证明
  2. 初识图机器学习(part5)--图表示学习2.0
  3. python观察日志(part11)--管道及MD5文件比较
  4. 《终身成长》读书笔记(part4)--创造性并不是出自灵感的神奇行为,而是努力工作和倾情奉献的结果
  5. 利用python爬虫(part4)--requests模块之requests.get方法
  6. SAP Spartacus Page Layout - 页面布局设计
  7. SAP Spartacus里的routerLink测试
  8. 什么是SAP CRM里的Sales Bundle?
  9. 使用Javap分析Java代码里的static final的工作原理
  10. 如何使用SAP Cloud for Customer OData服务创建Lead