java中ConcurrentLinkedQueue的入队

发布时间 - 2026-01-04 00:00:00    点击率:
ConcurrentLinkedQueue 的入队操作使用线程安全、无锁、基于 CAS 的 offer(E e) 方法,不接受 null 元素,保证 happens-before 可见性,且不抛出异常(除 NullPointerException 外)。

ConcurrentLinkedQueue 的入队操作使用 offer(E e) 方法,这是线程安全的、无锁(lock-free)的非阻塞入队方式。

入队方法是 offer(),不是 add()

虽然 ConcurrentLinkedQueue 实现了 Queue 接口,但推荐始终使用 offer(E e) 入队。它在成功时返回 true,且**永远不会抛出异常**(即使传入 null 也会直接抛出 NullPointerException)。不建议用 add(),因为它的语义是“失败时抛异常”,而该队列实际不会因容量满而失败(它是无界队列),所以 add() 只是简单委托给 offer(),没有额外价值。

入队过程是无锁且基于 CAS 的

底层通过原子操作(Compare-And-Swap)更新尾节点的 next 指针完成插入,整个过程不加锁、不阻塞线程。这意味着:

  • 多个线程可同时调用 offer(),彼此不会等待
  • 入队操作的平均时间复杂度为 O(1),最坏情况可能略高(如需跳过已删除节点或帮助推进尾节点),但仍是分摊常数时间
  • 无需担心死锁或线程饥饿问题

注意 null 值不允许

ConcurrentLinkedQueue 明确禁止 null 元素。一旦传入 nulloffer(null) 会立即抛出 NullPointerException。这不是运行时检查失败,而是设计上的硬性约束——因为 null 被用来标记链表末尾或删除状态,无法区分“空元素”和“结束标志”。

示例:

queue.offer(null); // 抛出 NullPointerException
queue.offer("item"); // 正常入队

入队后不保证立即对其他线程可见?不,它保证 happens-before

得益于内部使用的 volatile 读写和 CAS,每次成功的 offer() 都建立一个 happens-before 关系。也就是说:一个线程 A 成功入队后,另一个线程 B 后续调用 poll()peek() 有合理机会看到该元素(具体取决于执行时序和队列状态),JVM 和 CPU 不会因重排序导致“入队了却看不到”的问题。

基本上就这些。入队本身很简单,关键是理解它背后无锁、不可空、强可见性的设计约束。


# java  # app  # 无锁 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 scroll-view组件实现列表页实例代码  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  西安专业网站制作公司有哪些,陕西省建行官方网站?  Android自定义控件实现温度旋转按钮效果  如何在服务器上配置二级域名建站?  如何在服务器上三步完成建站并提升流量?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  Windows11怎样设置电源计划_Windows11电源计划调整攻略【指南】  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  网易LOFTER官网链接 老福特网页版登录地址  JavaScript如何实现继承_有哪些常用方法  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted  java获取注册ip实例  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Swift开发中switch语句值绑定模式  如何用低价快速搭建高质量网站?  谷歌Google入口永久地址_Google搜索引擎官网首页永久入口  黑客如何通过漏洞一步步攻陷网站服务器?  Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  JS碰撞运动实现方法详解  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  深圳网站制作平台,深圳市做网站好的公司有哪些?  Win11怎么设置默认图片查看器_Windows11照片应用关联设置  Laravel怎么使用artisan命令缓存配置和视图  php打包exe后无法访问网络共享_共享权限设置方法【教程】  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  Laravel Eloquent性能优化技巧_Laravel N+1查询问题解决  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  如何在建站主机中优化服务器配置?  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  Laravel如何实现多语言支持_Laravel本地化与国际化(i18n)配置教程  原生JS获取元素集合的子元素宽度实例  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel怎么实现模型属性的自动加密  Windows Hello人脸识别突然无法使用  HTML透明颜色代码怎么让下拉菜单透明_下拉菜单透明背景指南【技巧】  WEB开发之注册页面验证码倒计时代码的实现  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  Win11怎么更改系统语言为中文_Windows11安装语言包并设为显示语言  Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程