等待和通知看起来像是在线程之间传递的消息,如果这是真的,则必须有队列来缓冲这些消息。如果是这样,那么必须有用于向队列添加消息和从队列中删除消息的原子操作,是否每个 Java 线程都必须有一个帮助线程来侦听这些消息?
很高兴听到你的想法。
等待和通知看起来像是在线程之间传递的消息,如果这是真的,则必须有队列来缓冲这些消息。如果是这样,那么必须有用于向队列添加消息和从队列中删除消息的原子操作,是否每个 Java 线程都必须有一个帮助线程来侦听这些消息?
很高兴听到你的想法。
等待和通知看起来像是在线程之间传递的消息,
它们真的不是消息。当一个线程调用wait()
它时,它会将自己放入与特定对象监视器关联的等待队列中。当另一个线程调用notify()
它时,它会将第一个线程(如果有)从队列中拉出并将其放入“运行”队列中。它是关于改变线程状态并将线程放入队列而不是线程之间的消息。
如果是这样,那么必须有用于向队列添加消息和从队列中删除消息的原子操作
很可能没有围绕消息队列的原子操作,但肯定有围绕测试/设置内存位置的原子操作,这有助于获得锁并解决其他线程争用。
每个 Java 线程都必须有一个帮助线程来侦听这些消息吗?
每个 Java 线程肯定没有一个帮助线程。当 Java 线程从一种状态转换到另一种状态或被时间分割时,它们具有作为关联的 OS 线程来维护其状态并执行所有消息传递和信令。大多数(如果不是全部)实现还具有负责线程调度的操作系统和硬件,让 JVM 本机代码进行 Java 记帐。
JVM 使用由操作系统或有时由第三方库提供的原语。没有 JVM 自己实现这些东西。Windows JVM 通常使用 Windows 线程,而在 Linux 上,实现可以使用 Linux 内核线程或 POSIX 线程 ( pthreads
) 库。在 Mac OS X 上,选项包括pthreads
CocoaNSThread
库