免费分类信息网站大全网站建设html代码

张小明 2026/1/7 11:40:02
免费分类信息网站大全,网站建设html代码,个人主页怎么申请,网站不换域名换空间场景引入正如标题所言#xff0c;ArrayBlockingQueue是一个阻塞队列的数组实现#xff0c;如果要生动地描述阻塞队列的应用场景#xff0c;我想还是餐厅取餐、出餐的场景是最合适的#xff08;虽然我想这个场景已经被用烂了#xff09;。试想在学校的窗口取餐#xff0c;…场景引入正如标题所言ArrayBlockingQueue是一个阻塞队列的数组实现如果要生动地描述阻塞队列的应用场景我想还是餐厅取餐、出餐的场景是最合适的虽然我想这个场景已经被用烂了。试想在学校的窗口取餐一个窗口是预制好的烤肉拌饭另一个窗口则是现炒的小炒菜要如何选择先把目光移向烤肉拌饭因为出餐太快预制好的菜已经放满了窗台前出餐阿姨只能在窗口闲等等哪个着急的学生过来拿走一份饭她才能继续向上摆。再看向小炒菜由于味道美味很多学生都想吃但炒菜的出餐量有限学生没法立即享受到美味来晚的只能排队等待。哪怕学生再想吃窗台前都是空的没得拿只有出餐了才能拿。这就是阻塞队列的典型场景烤肉拌饭的窗台口已经摆满饭了阿姨只能阻塞等待有空了再放餐put操作。小炒菜的窗口太火爆了学生要想吃只能阻塞等待等轮到自己了在取餐take操作。API介绍放餐操作add、offer、putadd: 如果队列容量未满则插入指定元素; 成功时返回 true若当前无空位则抛出【IllegalStateException】offer: 如果队列容量未满则插入指定元素; 成功时返回 true若当前无空位则抛出 falseput: 如果队列容量未满则插入指定元素; 如果满了则阻塞等待有空位。如果等待时被打断则抛异常offer(long timeout, TimeUnit unit): 超时等待的put()。如果等着空了返回true如果超过timeout还是没有空位返回false取餐操作take、pollpoll: 如果队列容量不为空则取出队列头部并返回。如果为空返回nulltake: 如果队列容量不为空则取出队列头部并返回。如果为空则阻塞等待poll(long timeout, TimeUnit unit): 超时等待的take()如果队列容量不为空则取出队列头部并返回。如果为空则阻塞等待指定时间。如果超过时间还为空则返回null源码分析ArrayBlockingQueue的精髓之处就是阻塞等待的处理因此我将详细分析阻塞 take, put 相关的源码理解“阻塞”的灵魂所在。在此之前我们要先理解ArrayBlockingQueue的结构。从名字来看这个阻塞队列是以Array为基础的因此有界就很好理解。它是以数组为基础的数组的分配必须是连续的空间这段连续的空间就是阻塞队列的容量。同时我开篇也提到了这样的阻塞队列必须是线程安全的它底层使用了ReentrantLock来保证线程的安全。为什么还要有Condition等我们下文看源码就能知道了。enqueue、dequeue入队出队的底层//入队操作 private void enqueue(E e) { final Object[] items this.items; items[putIndex] e; if (putIndex items.length) putIndex 0; //如果当前元素入队后队列已满重置索引下一次再从队末进 count; notEmpty.signal();//如果元素加入到空队列中则唤醒阻塞等待的元素 }为什么不直接操作items反而要先定义一个局部变量final Object[] items this.items来接收它一、避免多次访问堆内存提升执行效率首先要明确 Java 的内存访问特性this.items是类的成员变量存储在堆内存中每次访问this.items都需要通过this引用堆地址去寻址相对耗时局部变量items存储在栈内存中栈内存的访问速度远快于堆内存而且局部变量的寻址是直接的无需额外间接引用。enqueue方法中多次用到了itemsitems[putIndex] e、putIndex items.length如果直接用this.items会多次触发堆内存寻址而先把this.items赋值给局部变量后续只需要访问栈上的局部变量即可减少了堆内存访问次数提升了执行效率。二、防止指令重排导致的可见性问题保证线程安全ArrayBlockingQueue是线程安全类items是共享成员变量虽然有ReentrantLock保证原子性但 Java 虚拟机的指令重排可能会导致潜在的可见性问题简单说final局部变量相当于给items数组拍了一张 “快照”确保整个enqueue方法执行期间使用的是同一个数组引用不会因为 JVM 优化而读取到错误的数组对象。//出队操作 private E dequeue() { final Object[] items this.items; SuppressWarnings(unchecked) E e (E) items[takeIndex]; //取出队列头部元素 items[takeIndex] null; //设为null if (takeIndex items.length) takeIndex 0; //与入队对应回到队末 count--; if (itrs ! null) itrs.elementDequeued(); notFull.signal(); //唤醒因队列满而阻塞等待的队列队列有空了 return e; }itrs是干什么的itrs是ArrayBlockingQueue用来管理当前所有活跃迭代器Iterator的集合目的是保证迭代器的弱一致性避免迭代过程中出现异常或错误的元素引用。当队列执行dequeue出队操作删除队首元素时会调用itrs.elementDequeued()核心目的是通知所有活跃迭代器“某个元素被删除了你们需要更新自己的状态避免遍历出错”。void elementDequeued() { // assert lock.isHeldByCurrentThread(); if (count 0) queueIsEmpty(); else if (takeIndex 0) takeIndexWrapped(); }queueIsEmpty()在本次出队后队列变空时重置迭代器状态nextIndex-1、remaining0标记迭代器遍历完毕避免无效遍历takeIndexWrapped()在本次出队后takeIndex循环回绕到数组开头时修正迭代器的nextWrapped状态保证迭代器能正确适配队列的循环结构put、take入队出队的实现public void put(E e) throws InterruptedException { Objects.requireNonNull(e); final ReentrantLock lock this.lock; lock.lockInterruptibly(); try { while (count items.length) notFull.await(); //如果队列满了阻塞等待 enqueue(e); } finally { lock.unlock(); } } public E take() throws InterruptedException { final ReentrantLock lock this.lock; lock.lockInterruptibly(); try { while (count 0) notEmpty.await(); //如果队列是空的阻塞等待 return dequeue(); } finally { lock.unlock(); } }可以看到ArrayBlockingQueue使用了ReentrantLock保证了入队出队的线程安全同时使用了条件变量实现了当队列为空/队列满了的情况下的阻塞等待。思考1. 可以看到take、put操作使用的都是同一把ReentrantLock这说明这两个操作是会互相阻塞的。怎么样才能让这两个操作独立起来2. 这个数组阻塞队列是强制有界的如果不确定队列大小的情况下该怎么处理这两个问题在 LinkedBlockingQueue 都给出了答复有兴趣的可以自行了解。我是沐浴露zz将持续更新有趣的技术欢迎互动交流
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

php违章网站开发跨境支付互联互通

LobeChat能否用于编写测试用例?软件工程辅助创新 在当今快速迭代的软件开发节奏中,测试环节正面临前所未有的压力:需求变更频繁、交付周期缩短、质量要求却只增不减。传统依赖人工设计测试用例的方式,越来越难以应对复杂系统的全面…

张小明 2026/1/6 6:57:07 网站建设

小型网站建设多少钱网站建设详细设计

目录 一、微前端架构概述 1.1 什么是微前端 1.2 核心优势 二、主流微前端方案对比 2.1 方案分类 2.2 方案选择建议 三、微前端落地实践 3.1 项目结构设计 3.2 主应用配置(基于qiankun) 3.3 微应用配置 3.4 通信机制设计 四、性能优化策略 4…

张小明 2026/1/6 6:57:05 网站建设

怎样做网站外部样式网站内容检测

🎛️ Timer & PWM 模块 —— 给你的开发板装上“节奏大师”! ✅ 适用对象:嵌入式初学者、电机/LED 控制开发者 💡 核心目标:理解 PWM 原理 掌握硬件 vs 软件实现 熟练使用 CubeMX 配置 调用 HAL 库控制 PWM &am…

张小明 2026/1/6 6:57:03 网站建设

管理wordpress太原seo按天计费

随着移动办公的普及,如何在手机上高效管理分散在各个云存储中的文件成为许多用户的痛点。OpenList移动端通过响应式设计完美解决了这个问题,让你在手机上也能轻松掌控所有存储资源。本文将为你揭秘10个实用技巧,助你成为移动端文件管理高手&a…

张小明 2026/1/6 8:55:26 网站建设

常州网站制作推广衡阳网站优化免费咨询

还在为OFD文档无法在手机或普通电脑上打开而烦恼吗?今天我要为你介绍一款超实用的OFD转PDF工具——Ofd2Pdf,让你轻松解决格式兼容问题!无论是公文处理、商务文档还是学习资料,只需简单几步就能完美转换,真正实现"…

张小明 2026/1/6 8:55:24 网站建设

爱站网查询wordpress 开发h5页面跳转

摘要 随着电子商务的快速发展,家电销售行业对高效、便捷的信息管理系统需求日益增长。传统的家电销售管理方式依赖人工操作,效率低下且容易出错,难以满足现代消费者对快速响应和精准服务的需求。家电销售展示平台信息管理系统通过整合线上销售…

张小明 2026/1/6 8:55:22 网站建设