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

JAVA herman 78浏览
公告:“业余草”微信公众号提供免费CSDN下载服务,关注业余草微信公众号,添加作者微信:xmtxtt,发送下载链接帮助你免费下载!
本博客日IP超过1300,PV 1800 左右,急需赞助商。
打开支付宝首页搜“567452957”领红包,间接赞助博主,谢谢!

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

昨天还有网友私信我,说面试被问到 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 规则

翻译解释如下:

  • 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作 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 内存模型中的一条规则。

参考资料

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,可以微信搜索:xmtxtt,备注:“xttblog”,添加助理微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » 10W+ 面试题,happens-before 规则