gpt4 book ai didi

java - 试图理解同步队列的机制

转载 作者:搜寻专家 更新时间:2023-10-31 20:12:34 26 4
gpt4 key购买 nike

我正在尝试阅读 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com