我试图阅读Synchronous Queue的实施
对我来说这不是那么简单 . 它似乎使用链接列表,其中每个节点都与一个线程相关联 .
核心部分使用旋转循环等待将任务放入队列中 .
我想知道为什么使用自旋循环代替像 wait/notify
这样的东西?
现在,由于这个恒定的自旋循环,其中一个核心消失了,对吧?
我试图理解这一点,并粗略地了解同步队列的设计
UPDATE
令我不安的是服务员线程如何开始/停止 .
我试图阅读Synchronous Queue的实施
对我来说这不是那么简单 . 它似乎使用链接列表,其中每个节点都与一个线程相关联 .
核心部分使用旋转循环等待将任务放入队列中 .
我想知道为什么使用自旋循环代替像 wait/notify
这样的东西?
现在,由于这个恒定的自旋循环,其中一个核心消失了,对吧?
我试图理解这一点,并粗略地了解同步队列的设计
UPDATE
令我不安的是服务员线程如何开始/停止 .
1 回答
SynchronousQueue
的意思是同步一些通常非常异步的东西 - 一个线程将一个项目放入队列而另一个线程试图从中获取 .SynchronousQueue
实际上根本不是队列 . 它没有容量,没有内部存储空间 . 它只允许在另一个进程当前正在尝试放入队列时从队列中取出 .例:
进程A尝试放入队列 . 现在阻止了 . 进程B尝试从队列中获取 . 由于有人试图放置,该项目从A转移到B,并且两者都被解锁 .
进程B尝试从队列中获取,但没有人尝试放入 . 所以B现在被阻止了 . 进程A现在想要放置一个项目 . 现在该项目被转移到B,A和B不再被阻止 .
关于阻止:
如果执行定时操作(如"try to take for 1 second"),Sun / Oracle JRE实现确实使用轮询而不是等待/通知模式 . 这是有道理的:它会定期重试,直到时间结束 . 当你进行非定时操作时(如"take, no matter how long it takes",它确实使用了
park
,如果情况发生了变化,它会再次唤醒 . 在这两种情况下,你的某个内核都不会一直忙于旋转循环 . 在这种情况下,for (;;)
表示"retry indefinately",它确实不是说"constant spinning" .