现实生活中,规则在社会运转发展中占据极为重要角色(比如根据工作的产出来判断你的贡献量),而JVM同样需要他的基石法则,他需要一丝不苟的执行人类丢给他的代码,happens-before规则应运而生,在jvm中就是判断先后及执行顺序的一部法则。
happens-before规则内容
1、程序次序原则:一个线程内,按照程序代码顺序,书写在前面的操作先行发生与书写在后面的操作。
我们可以理解为排队原则(先来后到),写在前面的操作先执行
2、监视器锁规则:一个unlock操作先行发生与后面对同一个锁的lock操作者,这里必须指同一个锁,后面指的是时间上的先后顺序。
当代码前后出现操作同一把锁时,释放锁的代码先于获取锁的代码,不释放大家岂不是一起罢工
3、volatile变量规则:对一个volatile变量的写操作先行发生于后面对这个变量的读操作,这里的后面同样指时间上的先后顺序。
对于volatile变量(保证内存可见性),写的执行优先级高于读。此处涉及java内存模型,明天补上。
4、线程启动规则:Thread对象的start方法先行发生于此线程的每一个动作
当考虑到线程内部执行指令顺序优化时,线程没启动其他全部白搭!!!(start方法第一)
5、线程终止规则:线程中的所有操作都先行发生于对此线程的终止检测,我们可以通过thread.join方法结束,thread.isAlive的返回值等手段检测到线程已经终止执行
保险杠放最后,线程的所有操作都先于该线程的终止检测(保险杠)
6、线程中断原则:对线程interrupt方法的调用先行发生于被中断线程的代码监测到中断时间的发生,可以通过interrupt方法检测到是否有中断发生
假如有两个线程A、B,A先执行了methodA,再调用B的interrupt方法,相当于将B线程的中断标志位置为1,JVM会在将来不确定的时间内将他中断,但是在中断前,线程A执行的methodA的变量对线程B可见!!!(就像你摔了一跤,你去医生那里上药,他虽然没看到你摔跤的动作,但他知道你的脸肯定此前被伤了)。
7、对象终结规则:一个对象的初始化完成,先行发生于它的finalize方法的开始
对象的初始化在finalize(析构函数)前执行!!!finalize方法执行在一个对象被回收前
8、传递性:如果A先行发生于B,B先行发生于C,则A先行发生于C
数学上的传递性在这也通吃。
网友评论