10W+ 面试题,happens-before 规则_java


今年的面试情况,被很多人吐槽。可能是人数和难度都有所增加。




过来一会他,又来了,说网上的解释我看不懂。能不能让我通俗的给他讲一下。


关于 happens-before 规则,我有一篇文章(非公众号)靠自然搜索已经达到 10w+ 的阅读了。


10W+ 面试题,happens-before 规则_java_02


所以,就借这个时间给大家通俗的讲一下 Happens-Before 吧。


happens-before 是从 JDK5 开始,java 使用新的 JSR -133 内存模型推出的一个规则。JSR-133 使用 happens-before 的概念来阐述操作之间的内存可见性。在 JMM 中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在 happens-before 关系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。


与程序员密切相关的 happens-before 规则如下:


10W+ 面试题,happens-before 规则_java_03


翻译解释如下:


  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作 happens-before 于书写在后面的操作;

  • 锁定规则:一个 unLock 操作先行发生于后面对同一个锁额 lock 操作;

  • volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;

  • 传递规则:如果操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C;

  • 线程启动规则:Thread对象的start()方法先行发生于此线程的每个一个动作;

  • 线程中断规则:对线程interrupt()方法的调用先行发生于被中断线程的代码检测到中断事件的发生;

  • 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过Thread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行;

  • 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;


需要注意的是,两个操作之间具有 happens-before 关系,并不意味着前一个操作必须要在后一个操作之前执行!happens-before 仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第二个操作之前(the first is visible to and ordered before the second)。happens- before 的定义很微妙,它可以看作 java 内存模型中的一条规则。


如果还有疑问,请加我微信号:xmtxtt,备注“进群”,进群共同讨论学习吧!


10W+ 面试题,happens-before 规则_java_04