Java -- 每日一问:Java内存模型中的happen-before是什么?
Posted Kevin-Dev
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java -- 每日一问:Java内存模型中的happen-before是什么?相关的知识,希望对你有一定的参考价值。
典型回答
Happen-before 关系,是 Java 内存模型中保证多线程操作可见性的机制,也是对早期语言规范中含糊的可见性概念的一个精确定义。
它的具体表现形式,包括但远不止是我们直觉中的 synchronized、volatile、lock 操作顺序等方面,例如:
-
线程内执行的每个操作,都保证 happen-before 后面的操作,这就保证了基本的程序顺序规则,这是开发者在书写程序时的基本约定。
-
对于 volatile 变量,对它的写操作,保证 happen-before 在随后对该变量的读取操作。
-
对于一个锁的解锁操作,保证 happen-before 加锁操作。
-
对象构建完成,保证 happen-before 于 finalizer 的开始动作。
-
甚至是类似线程内部操作的完成,保证 happen-before 其他 Thread.join() 的线程等。
这些 happen-before 关系是存在着传递性的,如果满足 a happen-before b 和 b happen-before c,那么 a happen-before c 也成立。
前面我一直用 happen-before,而不是简单说前后,是因为它不仅仅是对执行时间的保证,也包括对内存读、写操作顺序的保证。仅仅是时钟顺序上的先后,并不能保证线程交互的可见性。
你的朋友是不是也在准备面试呢?你可以“请朋友读”,把今天的题目分享给好友,或许你能帮到他。
以上是关于Java -- 每日一问:Java内存模型中的happen-before是什么?的主要内容,如果未能解决你的问题,请参考以下文章
Java -- 每日一问:如何监控和诊断JVM堆内和堆外内存使用?
Java -- 每日一问:对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?