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 -- 每日一问:谈谈你对 Java 平台的理解?

Java -- 每日一问:如何监控和诊断JVM堆内和堆外内存使用?

Java -- 每日一问:对比Java标准NIO类库,你知道Netty是如何实现更高性能的吗?

每日一问:谈谈 synchronized 和 CAS 机制

Java -- 每日一问:谈谈JVM内存区域的划分,哪些区域可能发生OutOfMemoryError?

Java -- 每日一问:Java提供了哪些IO方式? NIO如何实现多路复用?