Java基础、中级、高级、架构面试资料

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

JAVA herman 1613浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云

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

昨天还有网友私信我,说面试被问到 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)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!

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