happens-before原则的作用:判断两个操作之间是否存在冲突。如果符合happens-before规则,是不存在冲突。不符合happens-before规则,就需要自己处理线程安全的问题。
操作时间的先后顺序和先行发生(happens-before)之间没有必然关系?
也就是先行发生(happens - before)原则,不是说执行的时间顺序。这句话怎么理解。
例如:一个线程执行 i = 1 ; j =2;
按照happens-before原则中的程序次序原则(一般是代码在前先执行原则),i =1 操作先行于 j = 2;
但cpu完全有可能先执行i的初始化为0,然后cpu执行完 j = 2 再执行,i = 1,这样的结果也是正确的。所以说时间上先执行的, 并没有先行发生。
happens-before原则的: 以下几条操作是不需要考虑线程安全问题的,
程序次序规则(program order rule): 在一个线程内,先在前面的代码操作先行。准确的说控制流顺序而不是代码顺序。需要考虑分支,循环等结构。
管程锁定规则(monitor lock rule):同一个资源锁,先unlock,之后才能lock。
Volatile变量规则(volatile variable rule):一个变量被volatile修饰,多线程操作,先执行操作,再执行读操作。(同时写操作只能有一个)
线程启动规则(Thread start rule):Thread对象的start方法,先行发生于此线程的每一个方法。
线程终止规则(Thread Termination rule):该线程的所有方法,先行发生于该线程的终止检测方法。例如:可以通过Thread.join方法结束,Thread.isAlive()的返回值等手段检测到线程已经终止执行。
线程中断规则(Thread Interruption Rule): 中断方法先行发生于,中断检测方法。中断方法interrupt(),中断检测interrupted()方法。
对象终结规则(finalizer rule): 一个对象的初始化完成(构造函数执行结束)先行发生于它的finalizer方法的开始。
传递性(Transitivity): 如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。
原文链接:https://mp.weixin.qq.com/s/jEvpE2NHFBR56-NtFwQu_A
作者:一起写程序