今年的面试情况,被很多人吐槽。可能是人数和难度都有所增加。
昨天还有网友私信我,说面试被问到 happens-before 规则,我该怎么回答?这个说来话长,给他发了几个链接,并推荐他看看《2019 Java 高并发学习路线图和必会的 50 道面试题!》这个。
过来一会他,又来了,说网上的解释我看不懂。能不能让我通俗的给他讲一下。
关于 happens-before 规则,我有一篇文章(非公众号)靠自然搜索已经达到 10w+ 的阅读了。
所以,就借这个时间给大家通俗的讲一下 Happens-Before 吧。
happens-before 是从 JDK5 开始,java 使用新的 JSR -133 内存模型推出的一个规则。JSR-133 使用 happens-before 的概念来阐述操作之间的内存可见性。在 JMM 中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在 happens-before 关系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。
与程序员密切相关的 happens-before 规则如下:
翻译解释如下:
- 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作 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 内存模型中的一条规则。
参考资料
- https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4.5
: » 10W+ 面试题,happens-before 规则
原创文章,作者:254126420,如若转载,请注明出处:https://blog.ytso.com/252046.html