其他问题集中在语言所说的wait
和notify
是什么上——但这似乎不是你的问题……你谈论的是互斥体,这是一个实现细节,因此是特定于 JVM 的。
所以我们需要选择一个 JVM——让我们选择 openjdk(源代码在这里)。(最终)处理所有这些东西的代码位在hotspot/src/share/vm/runtime/objectMonitor.cpp
.
这维护了两个数据结构 - 一个等待集和一个条目集。等待线程被添加到等待集并停放,而尝试获取监视器的线程被添加到条目集然后停放。在notify
一个线程上,从等待集中取出并添加到条目集中。当一个线程释放锁时,它会从条目集中释放一个线程(如果有的话)。请注意,这些集合实际上是作为队列(链表)实现的,因此在 FIFO 基础上进行处理。
因此,在这种特殊情况下,实现处理等待对象的监视器并尝试以类似的方式获取对象的监视器。
但这只是一个 JVM 的一种实现(尽管其他人可能会做类似的事情)——所以我们不能依赖它。所以我想问题是你为什么想知道?如果只是好奇那就翻开openjdk的代码,很有意思。如果你打算在你的代码中使用这些信息......不要。
更新
我意识到说“公园”并不能告诉我们太多。停放线程的代码是特定于平台的(并且在名为 的对象中实现,该对象PlatformEvent
扩展ParkEvent
)。在我正在查看 linux 的 park 代码的 openjdk 版本中,可以找到hotspot/src/os/linux/vm/os_linux.cpp
并调用pthread_mutex_lock(_mutex)
...所以在回答你的问题时,调用 wait可能会在我的机器上使用互斥锁。请注意,在此之上会发生很多事情,这可能会阻止我们到达这一点。