关于 Java 的 synchronized 实现原理的疑惑


#1

最近在学习 Java 线程的时候遇到一个关于 synchronized 实现原理的问题

首先是使用 synchronized 的话,从字节码上看会执行 monitorenter。

然后我从 JVM 指令的规范说明中找到关于这个指令的说明:

  • If the entry count of the monitor associated with objectref is zero, the thread enters the monitor and sets its entry count to one. The thread is then the owner of the monitor.
  • If the thread already owns the monitor associated with objectref , it reenters the monitor, incrementing its entry count.
  • If another thread already owns the monitor associated with objectref , the thread blocks until the monitor’s entry count is zero, then tries again to gain ownership.

大体上是说,线程执行 monitorenter 的时候,如果对象 monitor 的 entry count 为 0 的时候,会进入对象的 monitor 并获得它的所有权。

如果对象 monitor 的 entry count 不为 0 的时候,将会进入 BLOCKED 状态。如果线程拥有 monitor 所有权的时候,又重新进入 monitor 的话,直接增加 entry count。

关于这个 entry count 的内容我产生了个疑惑:

在我们调用 Object.wait() 的时候,是否会像 monitorexit 一样减少 entry count,如果不会的话,那些因为没能获得 monitor 所有权而进入 BLOCKED 状态的线程是如何在 entry count 不为 0 的情况下,能够在其它线程进入等待的时候进入 monitor 的。


京ICP备16022265号-2 Kotlin China 2017 - 2018