并发编程实战15-重排序、happens-before

标签: 重排序 happens-before final
1人阅读 评论(0) 收藏 举报
分类:
  • 指令重排序
    为了优化CPU的运行效率,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据时造成的等待3。通过乱序执行的技术,处理器可以大大提高执行效率。
    比如:对于如下代码
int a = 10 // 1 
int b = 100 // 2
int c = a // 3

实际的执行过程可能会是:1-3-2,而不是:1-2-3;因为第一步获取a的值后,第三部仍然需要使用,此时,由于第二步并不会干扰单线程下程序了逻辑,将会直接执行3,再执行2.避免二次读取a值。(只是说明可能的原理,例子并不一定正确)

  • 数据依赖性(as-if-serial)

    • As-if-serial语义的意思是,所有的动作(Action)5都可以为了优化而被重排序,但是必须保证它们重排序后的结果和程序代码本身的应有结果是一致的。
    • 即如果后续逻辑计算需要依赖之前的某个值a,那么a这个值的计算步骤不能跳过。如上代码:第3步,c的值需要使用a,所以不能跳过1直接执行3
  • happens-before 规则
    语义:如果A先发生于B,那么A所做的所有改变都能被B看到
    Happens-before是用来指定两个操作之间的执行顺序。提供跨线程的内存可见性。在Java内存模型中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必然存在happens-before关系。

遵循的规则:
* 程序顺序规则:一个线程中的每个操作,happens- before 于该线程中的任意后续操作。
* 监视器锁规则:对一个监视器锁的解锁,happens- before 于随后对这个监视器锁的加锁。
* volatile变量规则:对一个volatile域的写,happens- before 于任意后续对这个volatile域的读。
* 传递性:如果A happens- before B,且B happens- before C,那么A happens- before C。

  • 锁和volatile的内存语义:(JMM)

    • 锁的获取:首先清空当前线程value内存,从主存中获取最新值;锁的释放:将当前线程内存value刷新到主内存
    • volatile的读写与锁的获取和释放对应,原理类似
  • final域的重排序规则
    对于final域,编译器和处理器要遵守两个重排序规则

1> 在构造函数内对一个final域的写入,与随后把这个构造函数的引用赋值给一个引用变量,两个操作不能重排序
2> 初次读一个包含final域对象的引用,和随后初次读这个final域,这两个操作不能重排序

美团点评博客-Java内存访问重排序的研究
深入理解Java内存模型(五)——锁
java多线程学习(九)final的内存语义

查看评论

使用Delphi,SDK编写Windows简单程序

        接触Delphi也已经有好长时间了,使用Delphi进行程序开发非常方便、快速,Delphi本身就提供了大量的组件(网上还有更多的组件)进行程序开发,这大大减轻了程序员的工作量,但是越...
  • dyroro
  • dyroro
  • 2002-07-22 10:10:00
  • 1143

《java并发编程实战》读书笔记一 可见性和重排序现象

可见性和“重排序(reordering)”现象
  • zyh5540
  • zyh5540
  • 2016-04-10 21:45:04
  • 504

Java重排序和happens-before原则

重排序重排序是编译器和处理器为了优化性能而对指令执行的顺序进行重排序。大多数现代处理器都会采用将指令乱序执行的方法,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据...
  • wsm0712syb
  • wsm0712syb
  • 2017-03-11 10:12:35
  • 361

不得不提的volatile及指令重排序(happen-before)

转:http://www.th7.cn/Program/java/201312/166504.shtml 一、不得不提的volatile volatile是个很老的关键字,几乎伴随...
  • wxwzy738
  • wxwzy738
  • 2015-01-28 20:43:17
  • 10988

JMM——重排序与happens-before

数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分为下列三种类型:   上述三种情况,只要重排序两个操作的执行顺序,程序的执行结...
  • hqq2023623
  • hqq2023623
  • 2016-03-30 09:49:09
  • 375

三、Java内存模型---重排序和顺序一致性

3.2 重排序 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。 3.2.1 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之...
  • lyt_7cs1dn9
  • lyt_7cs1dn9
  • 2017-06-15 14:12:31
  • 144

《java并发编程实战》+ 源码 高清完整PDF版

  • 2018年01月23日 16:41
  • 8.7MB
  • 下载

Java并发编程

  • 2017年12月28日 11:25
  • 40.81MB
  • 下载

《Java并发编程实战》- 个人阅读总结(一)

背景最近想更深入了解下Java多线程相关的知识,对Java多线程有一个全面的认识,所以想找一本Java多线程相关的书籍来阅读,最后我选择了《Java并发编程实战》这本个人认为还算相当不错,至于为什么选...
  • qq258513813
  • qq258513813
  • 2017-03-06 21:40:00
  • 1529
    个人资料
    持之以恒
    等级:
    访问量: 10万+
    积分: 2754
    排名: 1万+
    最新评论