我正在尝试阅读 Synchronous Queue 的实现
这对我来说不是那么简单。它似乎使用了一个链表,其中每个节点都与一个线程相关联。
核心部分使用自旋循环等待任务放入队列。
我想知道为什么要使用自旋循环而不是像 wait/notify
这样的东西?
现在,由于这个持续的自旋循环,其中一个核心消失了,对吧?
我试图理解这一点并粗略了解同步队列的设计
更新
同样困扰我的是服务员线程如何启动/停止。
最佳答案
SynchronousQueue
的要点是同步一些通常非常异步的东西 - 一个线程将一个项目放入队列,而另一个线程尝试从中取出。
SynchronousQueue
实际上根本不是一个队列。它没有容量,没有内部存储。它只允许在另一个进程当前试图放入队列时从队列中取出。
例子:
进程 A 尝试放入队列。这暂时阻塞。 进程 B 尝试从队列中获取。由于有人试图放置,因此元素从 A 转移到 B,并且两者都畅通无阻。
进程 B 尝试从队列中取出,但没有人尝试放入。所以 B 现在被阻止了。 进程 A 现在要放置一个项目。现在元素被转移到 B,A 和 B 不再被阻止。
关于拦截:
如果您执行定时操作(例如“尝试等待 1 秒”),Sun/Oracle JRE 实现会使用轮询而不是等待/通知模式。这是有道理的:它会定期重试,直到时间到了。当您执行非定时操作时(例如“无论需要多长时间”,它都会使用 park
,如果情况发生变化,它会再次唤醒。在这两种情况下,您的核心都不会不断忙于旋转一个循环。for (;;)
在这种情况下表示“无限期地重试”,它并不意味着“不断旋转”。
关于java - 试图理解同步队列的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18453503/