SynchronousQueue 是不存储元素的同步阻塞队列,用于线程间直接传递数据;生产者 put 与消费者 take 必须配对才能完成操作,size 始终为 0;常用于线程池直接交接、强耦合生产消费场景,不支持 peek/iterator 等查看操作,需确保双方线程协作完备。

SynchronousQueue 是 Java 并发包(java.util.concurrent)中的一种特殊阻塞队列,它**不存储元素**——每个插入操作(put)必须等待另一个线程执行对应的移除操作(take),反之亦然。它本质上是一个“交换通道”,用于线程间直接传递数据,而不是暂存数据。
为什么叫“同步”队列?
因为生产者和消费者必须“同步”配对才能完成一次数据传递:
- 调用
put(e)的线程会一直阻塞,直到有另一个线程调用take()接收这个元素; - 调用
take()的线程也会阻塞,直到有另一个线程调用put(e)提供元素; - 它内部容量为 0,
size()始终返回 0,isEmpty()始终返回true(即使有线程在等待)。
典型使用场景:线程间直接交接任务
它常被用在需要严格一对一交接的场合,比如:
-
线程池的直接交接策略:如
Executors.newCachedThreadPool()内部就用SynchronousQueue,新任务不会排队,而是直接交给空闲线程执行;若无空闲线程,则新建一个 —— 避免任务积压,适合大量短时任务; - 生产者-消费者强耦合流程:例如一个线程生成配置,另一个线程必须立即加载并生效,不允许缓存或丢弃;
- 简化协作逻辑:避免自己实现 wait/notify 或使用其他同步工具,靠队列本身保证“一手交钱、一手交货”。
要注意的几个关键点
使用时容易踩坑,需特别注意:
思乐微信商城微分销系统是以.net+access/mssql进行开发的微信分销系统。基于微信朋友圈的传播,是打造以分销商为中心的全新微信分销体验。让粉丝实时有效的获取朋友圈流量并快速分享购买分佣。因为是基于微信,所以要在微信上体验才更好。关注我们的微信核心功能:1、自动提示用户关注微信,解决一般程序无关注微信公众号的过程2、只要通过链接进一次,不过好久注册,什么方面注册,只要是用微信注册的,都会算
立即学习“Java免费学习笔记(深入)”;
- 它不支持
peek()、iterator()、toArray()等查看或批量操作,因为根本没有“队列中的元素”; - 不能用
offer(e, timeout, unit)或poll(timeout, unit)做“尽力而为”的尝试 —— 它只支持阻塞式put/take或带超时的put/take,超时后抛出异常或返回 false; - 如果只有生产者没有消费者(或反之),线程会永久阻塞(除非设了超时),务必确保协作逻辑完备;
- 它有两种实现模式:
Fair(公平模式,按 FIFO 顺序匹配线程)和Nonfair(默认,可能“插队”匹配,性能略高)。
基本上就这些。SynchronousQueue 不是拿来“存东西”的,而是用来“传东西”的——设计初衷就是让线程等彼此,一步到位,不拖泥带水。










