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

标签 java multithreading concurrency nonblocking java.util.concurrent

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

相关文章:

xcode - 为什么我的 NSURLConnection 委托(delegate)方法没有被调用?

multithreading - Rails Thread.current 变量是否与单个用户请求隔离?

并发访问且不受数据结构的影响

java - 分布式文件系统类使用本地而不是分布式类

java - JDeveloper ADF Mobile -- javax.crypto - 无法找到策略文件

java - 当我在模拟器上运行时,我的应用程序风格发生了变化

Java: jsr166y Phaser 教程/讲解

java - 在枚举中添加映射并将键和值放入其中?

c# - 我需要线程锁对象吗?

java - 在特定时间运行java线程