zoukankan      html  css  js  c++  java
  • happens-before规则

    happens-before原则:

    • happens-before它是判断数据是否存在竞争、线程是否安全的主要依据。为了保证线程安全我们可以让2个操作具有happens-before关系。(JDK5 开始)
    1. 如果一个操作happens-before与另一个操作,那么第一个操作的结果将对第二个操作可见,而且第一个操作的执行顺序在第二个操作之前,但这顺序仅仅是对于程序员来说是这样,实际执行并不一定。
    2. 如果2个操作重排序之后 执行的结果与happens-before规则执行的结果一样则允许重排序。

    happens-before的8条规则能够保证存在happens-before规则的单一线程或者多条线程之中的2个操作是安全的。

    1. 程序顺序规则一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作。
    2. 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
    3. volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
    4. 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
    5. start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
    6. join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回
    7. 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
    8. 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;

    参考资料

    1. 《Java并发编程的艺术》
    2. 【死磕Java并发】-----Java内存模型之happens-before
  • 相关阅读:
    转载——关于scanf造成死循环
    转载——关于C#延时
    2013.02.13——笔记
    最近计划
    关于毕业设计——2013.4.12
    关于c#中combobox赋值问题
    使用DWE编辑对话框窗体
    Insert New Class (a2BusNew under BusItem)
    将TCE链接加入新工作通知(NewWorkAssignment,Sig)邮件中
    创建Relation并Add到数据库
  • 原文地址:https://www.cnblogs.com/mibloom/p/9452548.html
Copyright © 2011-2022 走看看