happens-before背景由来
happens-before的概念最初由Leslie Lamport在其一篇影响深远的论文(《Time,Clocks and the Ordering of Events in a Distributed System》)中提出。Leslie Lamport使用 happens-before
来定义分布式系统中事件之间的 偏序关系(partial ordering)
。Leslie Lamport在这篇论文中给出了一个分布式算法,该算法可以将该偏序关系扩展为某种 全序关系
。 JSR-133使用 happens-before
的概念来指定两个操作之间的执行顺序。由于这两个操作可以在一个线程之内,也可以是在不同线程之间 。因此,JMM可以通过 happens-before
关系向程序员提供跨线程的内存可见性保证 (如果A线程的写操作a与B线程的读操作b之间存在happens-before关系,尽管a操作和b操作在不同的线程中执行,但JMM向程序员保证a操作将对b操作可见)。
happens-before规则
《JSR-133:Java Memory Model and Thread Specification》定义了如下happens-before规则 程序顺序规则 一个线程中的每个操作,happens-before于该线程中的任意后续操作。 监视器锁规则 对一个锁的解锁,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()操作成功返回。
-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明
啥是happens-before原则
Java的内存模型具备一些天生
的有序性规则,不需要任何同步手段就能够保证有序性,这个规则被称为Happens-before
原则。 如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就无法保证有序性,也就是说虚拟机或者处理器可以随意对它们进行重排序处理。
happens-before原则
happens-before原则 程序次序规则 在一个线程内,代码按照编写时的次序执行,编写在后面的操作发生于编写在前面的操作之后 这句话的意思看起来是程序按照编写的顺序来执行,但是虚拟机还是可能会对程序代码的指令进行重排序
,只要确保在一个线程内最终的结果和代码顺序执行的结果一致即可 锁定规则 一个unlock操作要先行发生于对同一个锁的lock操作 这句话的意思是,无论是在单线程还是在多线程的环境下,如果同一个锁是锁定状态,那么必须先对其执行释放操作之后才能继续进行lock操作 volatile变量规则 对一个变量的写操作要早于对这个变量之后的读操作 根据字面的意思来理解是,如果一个变量使用volatile关键字修饰,一个线程对它进行读操作,一个线程对它进行写操作,那么写入操作肯定要先行发生于读操作 传递规则 如果操作A先于操作B,而操作B又先于操作C,则可以得出操作A肯定要先于操作C 这一点说明了happens-before原则具备传递性 线程启动规则 Thread对象的start()方法先行发生于对该线程的任何动作 只有start之后线程才能真正运行,否则Thread也只是一个对象而已 线程中断规则 对线程执行interrupt()方法肯定要优先于捕获到中断信号 这句话的意思是指如果线程收到了中断信号,那么在此之前势必要有interrupt() 线程的终结规则 线程中所有的操作都要先行发生于线程的终止检测 通俗地讲,线程的任务执行、逻辑单元执行肯定要发生于线程死亡之前 对象的终结规则 一个对象初始化的完成先行发生于finalize()方法之前 这个更没什么好说的了,先有生后有死
-----------------------------------------------------------------------------书名:Java高并发编程详解:多线程与架构设计 作者:汪文君