首页 文章

试图了解同步队列的机制

提问于
浏览
5

我试图阅读Synchronous Queue的实施
对我来说这不是那么简单 . 它似乎使用链接列表,其中每个节点都与一个线程相关联 .
核心部分使用旋转循环等待将任务放入队列中 .
我想知道为什么使用自旋循环代替像 wait/notify 这样的东西?
现在,由于这个恒定的自旋循环,其中一个核心消失了,对吧?
我试图理解这一点,并粗略地了解同步队列的设计

UPDATE
令我不安的是服务员线程如何开始/停止 .

1 回答

  • 4

    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" .

相关问题