happens-before规则
Posted Mibloom
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了happens-before规则相关的知识,希望对你有一定的参考价值。
happens-before原则:
- happens-before它是判断数据是否存在竞争、线程是否安全的主要依据。为了保证线程安全我们可以让2个操作具有happens-before关系。(JDK5 开始)
- 如果一个操作happens-before与另一个操作,那么第一个操作的结果将对第二个操作可见,而且第一个操作的执行顺序在第二个操作之前,但这顺序仅仅是对于程序员来说是这样,实际执行并不一定。
- 如果2个操作重排序之后 执行的结果与happens-before规则执行的结果一样则允许重排序。
happens-before的8条规则能够保证存在happens-before规则的单一线程或者多条线程之中的2个操作是安全的。
- 程序顺序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作。
- 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
- volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读。
- 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C。
- start()规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作。
- join()规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回
- 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;
- 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;
参考资料
- 《Java并发编程的艺术》
- 【死磕Java并发】-----Java内存模型之happens-before
以上是关于happens-before规则的主要内容,如果未能解决你的问题,请参考以下文章