我试图阅读Synchronous Queue的实施
对我来说这不是那么简单。它似乎使用链接列表,其中每个节点都与一个线程相关联
核心部分使用旋转循环等待任务放入队列
我想知道为什么使用自旋循环代替wait/notify
之类的东西?
现在这样,其中一个核心由于这个恒定的自旋循环而消失了,对吧?
我试图理解这一点,并大致了解同步队列的设计
更新
令我不安的是服务员线程如何开始/停止。
答案 0 :(得分:4)
SynchronousQueue
的目的是同步一些通常非常异步的东西 - 一个线程将一个项目放入队列而另一个线程试图从中获取。
SynchronousQueue
实际上根本不是队列。它没有容量,没有内部存储空间。它只允许在另一个进程当前正在尝试放入队列时从队列中获取。
示例:
进程A尝试放入队列。现在阻止了。 进程B尝试从队列中获取。由于某人试图放置,该项目从A转移到B,并且两者都被解锁。
进程B尝试从队列中获取,但没有人尝试放入。所以B现在被阻止了。 进程A现在想要放置一个项目。现在该项目被转移到B,A和B不再被阻止。
关于阻止:
如果您执行定时操作(例如“尝试拍摄1秒钟”),Sun / Oracle JRE实现确实使用轮询而不是等待/通知模式。这是有道理的:它会定期重试,直到时间结束。当你进行非定时操作时(比如“采取,无论需要多长时间”)它会使用park
,如果情况发生变化,它会再次唤醒。在这两种情况下你的核心都不会一直忙着旋转在这种情况下,for (;;)
表示“无限重试”,并不意味着“不断旋转”。