0

0

Java里的SynchronousQueue有什么特别之处_零容量队列的工作模式

P粉602998670

P粉602998670

发布时间:2026-02-27 13:58:03

|

650人浏览过

|

来源于php中文网

原创

synchronousqueue 不支持 add() 和 offer(),因其无缓冲空间,仅用于线程间直接握手传递;put() 和 take() 阻塞等待配对操作,size() 恒为 0。

java里的synchronousqueue有什么特别之处_零容量队列的工作模式

为什么 SynchronousQueue 不能直接 add()offer()

它根本不是用来“存东西”的队列,而是为线程间**直接握手传递**设计的。调用 put() 的线程会一直阻塞,直到另一个线程正好在同时调用 take();反过来也一样。没有缓冲空间,所以 add()offer() 永远返回 false(除非有配对线程正在等待)。

  • offer(e) 立即返回 false —— 因为没地方暂存
  • put(e) 会挂起当前线程,直到有消费者来取
  • poll() 立即返回 null —— 因为没人刚放进来
  • take() 会挂起当前线程,直到有生产者来放

SynchronousQueueThreadPoolExecutor 中的真实作用

它常被用作线程池的阻塞队列,比如 Executors.newCachedThreadPool() 内部就用了它。这时它的行为是:任务提交时若无空闲线程,就立刻创建新线程;而不是把任务排队等——这和你直觉里的“队列”完全相反。

  • 搭配 corePoolSize=0 + maximumPoolSize=MAX_VALUE 才能发挥效果
  • 任务不会堆积,但线程可能无限增长(注意 OOM 风险)
  • 不适合高吞吐、低延迟敏感场景,因为每次任务交接都涉及线程唤醒开销

用错 SynchronousQueue 的典型错误现象

最常见的是程序卡死或线程永远阻塞,尤其在单线程环境或未配对调用时。

ColorMagic
ColorMagic

AI调色板生成工具

下载
  • 只调 put("x") 不调 take() → 生产者线程永久 WAITING
  • 只调 take() 不调 put() → 消费者线程永久 WAITING
  • 在同一个线程里先 put()take() → 必死锁(自己等自己)
  • size() 判断是否为空 → 总是返回 0,毫无意义

替代方案选型:什么时候不该用 SynchronousQueue

它只适合明确需要“点对点即时交接”的场景。一旦你需要缓冲、重试、批量处理或异步解耦,它就成累赘了。

立即学习Java免费学习笔记(深入)”;

  • 要积压任务?换 LinkedBlockingQueueArrayBlockingQueue
  • 要控制并发数?用 Semaphore 配合普通队列更直观
  • 要做背压或流控?TransferQueue 子类如 LinkedTransferQueue 更灵活
  • 测试时想绕过阻塞?别硬等,改用带超时的 poll(1, TimeUnit.SECONDS) 或换队列

它的特别之处不在容量为零,而在于强制要求“同步协作”——这个契约一旦被打破,就只剩阻塞和死锁。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

248

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

906

2024.03.01

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

248

2023.09.22

java中null的用法
java中null的用法

在Java中,null表示一个引用类型的变量不指向任何对象。可以将null赋值给任何引用类型的变量,包括类、接口、数组、字符串等。想了解更多null的相关内容,可以阅读本专题下面的文章。

906

2024.03.01

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

427

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

599

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

721

2023.08.10

Golang 实际项目案例:从需求到上线
Golang 实际项目案例:从需求到上线

《Golang 实际项目案例:从需求到上线》以真实业务场景为主线,完整覆盖需求分析、架构设计、模块拆分、编码实现、性能优化与部署上线全过程,强调工程规范与实践决策,帮助开发者打通从技术实现到系统交付的关键路径,提升独立完成 Go 项目的综合能力。

2

2026.02.26

Golang Web 开发路线:构建高效后端服务
Golang Web 开发路线:构建高效后端服务

《Golang Web 开发路线:构建高效后端服务》围绕 Go 在后端领域的工程实践,系统讲解 Web 框架选型、路由设计、中间件机制、数据库访问与接口规范,结合高并发与可维护性思维,逐步构建稳定、高性能、易扩展的后端服务体系,帮助开发者形成完整的 Go Web 架构能力。

5

2026.02.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Kotlin 教程
Kotlin 教程

共23课时 | 3.9万人学习

C# 教程
C# 教程

共94课时 | 10.2万人学习

Java 教程
Java 教程

共578课时 | 72.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号