《请告诉我你对Happens-Before的理解》听到这个问题,你知道怎么回答了吗??大家好,我是Mic,一名拥有14年经验的Java程序员。并发编程是面试过程中重点考察的方向。关于这个问题,可以研究的方向很多。我把大师的答案整理成了15W字的面试文档。可以私信我接收下方大师的解答。师父:首先,Happens-Before是一个可见性模型,即在多线程环境下。本来,指令重排序的存在会导致数据可见性的问题,即线程A修改共享变量对线程B是不可见的。因此,JMM通过Happens-Before关系为开发者提供了跨线程的内存可见性保证。如果一个操作的执行结果对另一个操作可见,则这两个操作之间必须有Happens-Before管理。其次,Happens-Before关系只描述了结果的可见性,并不表示指令执行的先后顺序,也就是说只要不影响结果,指令的重新排序还是允许的。最后,JMM中有很多Happens-Before规则。程序顺序规则,一个线程中的每一个操作,以及happens-before线程中的任何后续操作,都可以简单的看做as-if-serial,即无论怎么重新排序,单线程程序的执行结果都不会改变传递性规则,即AHappens-BeforeB,BHappens-BeforeC。可以推导出AHappens-BeforeC。volatile变量规则,写入一个volatile修饰的变量必须happen-before任何后续对该volatile变量的读操作监控锁规则,一个线程释放锁进行锁操作,必须happen-before并且后续线程在做这个Lock锁操作中这种场景下,如果线程A获取到锁并将x修改为12,那么后续线程获取到锁后获取到的x的值一定是12。线程启动规则,如果线程A执行了ThreadB.start()操作,则线程A的ThreadB.start()之前的操作happens-before线程B中的任何操作。在这样的场景下,对于t1线程启动前x=10的赋值操作,t1线程启动后读取的x的值一定是10.Join规则,如果线程A执行操作ThreadB.join()并成功返回,则线程B中的任何操作happens-before线程A从ThreadB.join()操作成功返回。总结一下Happens-Before模型,它是多线程开发中必须理解和掌握的一个规则。它可以指导开发人员在使用多线程开发时避免内存可见性问题。所以,这道面试题其实就是考验求职者的基本能力。请记得点赞、收藏和关注!!!版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!
