Jim*_*Jim 5 java concurrency multithreading nonblocking java.util.concurrent
我试图阅读同步队列的实现
对我来说并不是那么简单.它似乎使用链接列表,其中每个节点都与一个线程相关联.
核心部分使用旋转循环等待将任务放入队列中.
我想知道为什么使用旋转循环代替类似的东西wait/notify?
现在,由于这个恒定的自旋循环,其中一个核心消失了,对吧?
我试图理解这一点,并粗略地了解同步队列的设计
更新令
我不安的是服务员线程如何启动/停止.
其要点SynchronousQueue是同步通常非常异步的东西 - 一个线程将一个项目放入队列中,而另一个线程尝试从中获取项目。
SynchronousQueue实际上根本不是队列。它没有容量,没有内部存储空间。它只允许当另一个进程当前试图放入队列时从队列中取出。
例子:
进程A尝试放入队列。现在这会被阻止。进程 B 尝试从队列中获取。由于有人试图放入,物品从 A 转移到 B,并且两者都被解锁。
进程 B 尝试从队列中取出数据,但没有人尝试放入。所以B现在被阻止了。进程 A 现在想要放入一个项目。现在该项目已转移给 B,并且 A 和 B 不再被阻止。
关于屏蔽:
如果您执行定时操作(例如“尝试花费 1 秒”),Sun/Oracle JRE 实现确实使用轮询而不是等待/通知模式。这是有道理的:它会定期重试,直到时间到。当您执行非定时操作(例如“采取,无论需要多长时间”)时,它确实会使用park,如果情况发生变化,它会再次唤醒。在这两种情况下,您的一个核心都不会不断地忙于旋转循环。这for (;;)意味着在这种情况下,“无限期重试”并不意味着“不断旋转”。
| 归档时间: |
|
| 查看次数: |
1811 次 |
| 最近记录: |