6

我试图阅读同步队列
的实现 对我来说并不是那么简单。它似乎使用了一个链表,其中每个节点都与一个线程相关联。
核心部分使用一个自旋循环等待任务被放入队列。
我想知道为什么要使用自旋循环而不是类似的东西wait/notify
现在,由于这个不断的自旋循环,其中一个核心消失了,对吧?
我试图理解这一点,并大致了解同步队列的设计

更新
让我感到困扰的是服务员线程如何启动/停止。

4

1 回答 1

4

的重点SynchronousQueue是同步通常非常异步的东西 - 一个线程将项目放入队列,而另一个线程试图从中获取。

SynchronousQueue实际上根本不是队列。它没有容量,没有内部存储。它只允许在另一个进程当前试图放入队列时从队列中取出。

例子:

进程 A 尝试放入队列。这暂时阻止。进程 B 尝试从队列中取出。由于有人试图放置,因此项目从 A 转移到 B,并且两者都被解锁。

进程 B 尝试从队列中取出,但没有人尝试放入。所以B现在被阻止了。进程 A 现在想要放置一个项目。现在该项目被转移到 B,并且 A 和 B 不再被阻止。

关于阻塞:

如果您执行定时操作(例如“尝试等待 1 秒”),Sun/Oracle JRE 实现确实使用轮询而不是等待/通知模式。这是有道理的:它会定期重试,直到时间到。当您执行非定时操作时(例如“采取,无论花费多长时间”,它确实使用park,如果情况发生变化,它会再次唤醒。在这两种情况下,您的一个核心都不会一直忙于旋转循环。for (;;)意味着在这种情况下,“无限重试”并不意味着“不断旋转”。

于 2013-08-26T21:53:05.577 回答