网站做提示框北滘网站建设

张小明 2026/1/13 0:31:23
网站做提示框,北滘网站建设,二级栏目网站,站长工具搜一搜场景引入正如标题所言#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进行投诉反馈,一经查实,立即删除!

烟台百度网站排名织梦服务行业手机网站模板

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个保密工作源头管理系统的MVP,包含敏感信息识别、权限设置和审批流程模块。系统应提供简洁的UI界面,支持快速配置规则,并生成可演示的交互…

张小明 2026/1/1 14:46:45 网站建设

网站联系方式修改织梦深圳网站建设找哪家公司

在精密测量与数据采集系统中,模数转换器(ADC)的性能直接影响系统的整体精度与稳定性。JEPSUN HCT6801与CS5532均为高精度Σ-Δ型ADC,广泛应用于工业控制、仪器仪表、传感器信号调理等领域。本文将从捷比信提供的技术参 数、环境适…

张小明 2026/1/5 18:09:54 网站建设

互联网网站解决方案asp网站 攻击

Linux系统使用与管理全解析 在Linux系统的使用和管理过程中,我们会遇到各种各样的问题,下面将为大家详细介绍一些常见操作和相关知识。 1. 脚本中Perl路径的调整 在执行脚本时,脚本开头的路径可能需要根据实际情况进行调整。例如,一个脚本可能以如下行开头: #!/usr/l…

张小明 2026/1/11 22:44:28 网站建设

企业网站设计seo中国民航机场建设集团网站

RS ASIO零延迟音频解决方案:告别摇滚史密斯卡顿问题 【免费下载链接】rs_asio ASIO for Rocksmith 2014 项目地址: https://gitcode.com/gh_mirrors/rs/rs_asio 你是否曾经在《Rocksmith 2014 Edition - Remastered》中按下琴弦后,声音却延迟半拍…

张小明 2026/1/7 13:38:22 网站建设

做导购网站需要多大的服务器乐清门户网

四边形网格生成实战指南:掌握QuadriFlow高效工作流 【免费下载链接】QuadriFlow QuadriFlow: A Scalable and Robust Method for Quadrangulation 项目地址: https://gitcode.com/gh_mirrors/qu/QuadriFlow 在三维建模和数字设计领域,如何将复杂的…

张小明 2026/1/3 16:08:30 网站建设

西安商城类网站制作wordpress文章有模板下载

第一章:医院挂号难终结者(Open-AutoGLM技术深度解析)在医疗资源紧张的背景下,医院挂号难长期困扰患者。Open-AutoGLM 技术应运而生,通过融合自然语言理解与自动化调度系统,实现智能分诊、动态号源分配和实时…

张小明 2026/1/1 20:10:21 网站建设