zoukankan      html  css  js  c++  java
  • Java先行发生原则(Happen-Before)

    简介:

    先行发生原则是Java内存模型中定义的两个操作之间的偏序关系。比如说操作A先行发生于操作B,那么在B操作发生之前,A操作产生的“影响”都会被操作B感知到。这里的影响是指修改了内存中的共享变量、发送了消息、调用了方法等。个人觉得更直白一些就是有可能对操作B的结果有影响的都会被B感知到,对B操作的结果没有影响的是否感知到没有太大关系。

    八大先行发生原则:

    1.程序次序原则
    在一个线程内部,按照代码的顺序,书写在前面的先行发生与后边的。或者更准确的说是在控制流顺序前面的先行发生与控制流后面的,而不是代码顺序,因为会有分支、跳转、循环等。

    2.管程锁定规则
    一个unlock操作先行发生于后面对同一个锁的lock操作。这里必须注意的是对同一个锁,后面是指时间上的后面

    3.volatile变量规则
    对一个volatile变量的写操作先行发生与后面对这个变量的读操作,这里的后面是指时间上的先后顺序

    4.线程启动规则
    Thread对象的start()方法先行发生与该线程的每个动作。当然如果你错误的使用了线程,创建线程后没有执行start方法,而是执行run方法,那此句话是不成立的,但是如果这样其实也不是线程了

    5.线程终止规则
    线程中的所有操作都先行发生与对此线程的终止检测,可以通过Thread.join()和Thread.isAlive()的返回值等手段检测线程是否已经终止执行

    6.线程中断规则
    对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生,可以通过Thread.interrupted()方法检测到是否有中断发生。

    7.对象终结规则
    一个对象的初始化完成先行发生于他的finalize方法的执行,也就是初始化方法先行发生于finalize方法

    8.传递性
    如果操作A先行发生于操作B,操作B先行发生于操作C,那么操作A先行发生于操作C。

  • 相关阅读:
    手工创建数据库的全部脚本及说明(转)
    HNOI 2009 梦幻布丁 链表 启发式合并
    【除草】【hnoi】精简题解
    矩阵乘法
    忧桑啊。。。
    【水】【SCOI】 精简题解
    [数论][SDOI2012]Longge的问题
    【2013】省选
    【集训队互测】ayq 三道题
    【水】 【SDOI】 极精简题解
  • 原文地址:https://www.cnblogs.com/chx9832/p/12580555.html
Copyright © 2011-2022 走看看