关闭

happens-before知识

280人阅读 评论(0) 收藏 举报
分类:
1,happens-before定义
1),如果一个操作happens-before另一个操作,那么第一个操作结果对第二个操作可见,并且第一个的执行顺序排在第二个操作之前(这里指的是位置在前,具体的内存执行指令谁先进行不一定按这个顺序)
2),两个操作存在happens-before关系,并不意味着java平台的具体实现必须按照happens-before关系指定的顺序来执行。如果重排序之后的执行结果,与按happens-before的执行结果一致,那么这种重排序不违法,即JMM允许这种重排序

2,与as-if-serial语义的关系
as-if-serial语义:
        不管怎么重排序(编译器合处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器、runtime和处理器都必须遵守as-if-serial语义。
1),as-if-serial语义保证但程程内程序的执行结果不被改变,happens-before关系保证正确同步的多线程程序的执行结果不会被改变
2),as-if-serial的感觉是单线程程序是按照程序的顺序来执行的
      happens-before给正确同步的多线程程序的感觉是:正确同步的多线程程序是按happens-before指定的顺序来执行的

3,happens-before规则
1),程序顺序规则:程序中的每个操作都happens-before于该线程的任意后序操作
2),监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁
3)volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读
4)传递性:A HB B,B HB C,则A HB C
5)start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么线程A线程的ThreadB.start()操作happens-before于线程B中的任何操作
6)join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

什么是Java中的happen-before关系

“Let A and B represent operations performed by a multithreaded process. If A happens-before B, then the memory effects of A effectively become visib...
  • lantianjialiang
  • lantianjialiang
  • 2014-02-08 17:14
  • 1350

通俗易懂讲解happens-before原则

在接下来的叙述里我首先会说明happens-before规则是干什么用的,然后用一个简单的小程序说明happens-before规则 一、happens-before规则 我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效率)才会被运行,优化分为很多种,其中有一种优化叫做...
  • u010031673
  • u010031673
  • 2015-09-01 11:50
  • 3646

Java多线程 -- 深入理解JMM(Java内存模型) -- happens-before俗解

学习Java并发,到后面总会接触到happens-before偏序关系。初接触玩意儿简直就是不知所云,下面是经过一段时间折腾后个人对此的一点浅薄理解,希望对初接触的人有帮助。如有不正确之处,欢迎指正。 synchronized、大部分锁,众所周知的一个功能就是使多个线程互斥/串行的(共享锁允许多个...
  • fw0124
  • fw0124
  • 2015-01-15 14:55
  • 6794

从单例模式到Happens-Before

本文主要从简单的单例模式为切入点,分析单例模式可能存在的一些问题,以及如何借助Happens-Before分析、检验代码在多线程环境下的安全性。
  • mian_CSDN
  • mian_CSDN
  • 2016-12-12 22:51
  • 189

基于Happens-before的数据竞争方法汇总 (三)

在上一篇文章中提到了基于happens-before关系的FastTrack动态数据竞争检测方法,这篇文章中介绍的Loft方法是在FastTrack方法上进行了进一步地改进。
  • yiranyaoqiu
  • yiranyaoqiu
  • 2016-01-26 09:57
  • 412

java内存模型中的happens-before

java内存模型中的happens-before 1)概念:JMM用happens-before的概念来指定两个操作之间的执行顺序,这两个操作可以在一个线程内,也可以在不同线程之间,并且保证了内存的可见性。 2)happens-before的定义: 1)从程序员的角度看: 如果一...
  • A__17
  • A__17
  • 2017-10-09 22:31
  • 124

Java重排序和happens-before原则

重排序重排序是编译器和处理器为了优化性能而对指令执行的顺序进行重排序。大多数现代处理器都会采用将指令乱序执行的方法,在条件允许的情况下,直接运行当前有能力立即执行的后续指令,避开获取下一条指令所需数据时造成的等待。通过乱序执行的技术,处理器可以大大提高执行效率。也就是说程序的执行,并不是严格按照程序...
  • wsm0712syb
  • wsm0712syb
  • 2017-03-11 10:12
  • 275

多线程 happens-before规则

简介      Java使用新的JSR-133内存模型,JSR-133使用happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。这...
  • a1211529911
  • a1211529911
  • 2016-05-25 10:55
  • 1588

指令重排与happens-before

我们在平时所习惯的单线程编程中默认了一种乐观的模型——串行一致性。即在程序中只存在唯一的操作执行顺序,并且在每次读取变量时,都能获得在执行序列(任何处理器)最近一次写入该变量的值。但在JMM以及底层的任何一看现代多处理器架构中都不会提供这种串行一致性。这在并发编程中会造成一些在单线程环境下看来难以理...
  • luotuomianyang
  • luotuomianyang
  • 2016-08-19 09:57
  • 172

通俗易懂讲解happens-before原则

一、happens-before规则 我们编写的程序都要经过优化后(编译器和处理器会对我们的程序进行优化以提高运行效率)才会被运行,优化分为很多种,其中有一种优化叫做重排序,重排序需要遵守happens-before规则,不能说你想怎么排就怎么排,如果那样岂不是乱了套。 happens-...
  • jeversoncui123
  • jeversoncui123
  • 2018-01-03 07:04
  • 18
    个人资料
    • 访问:110587次
    • 积分:2290
    • 等级:
    • 排名:第18946名
    • 原创:98篇
    • 转载:17篇
    • 译文:5篇
    • 评论:20条
    博客专栏