当前位置:网站首页 > C++编程 > 正文

juc阻塞队列(什么叫阻塞队列)



AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。

CLH同步队列是一个FIFO双向队列,AQS依赖它来完成同步状态的管理,当前线程如果获取同步状态失败时,AQS则会将当前线程已经等待状态等信息构造成一个节点(Node)并将其加入到CLH同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点唤醒(公平锁),使其再次尝试获取同步状态。

在CLH同步队列中,一个节点表示一个线程,它保存着线程的引用(thread)、状态(waitStatus)、前驱节点(prev)、后继节点(next),其定义如下:

CLH同步队列结构图如下:

cdh yarn 队列_数据结构

学了数据结构的我们,CLH队列入列是再简单不过了,无非就是tail指向新节点、新节点的prev指向当前最后的节点,当前最后一个节点的next指向当前节点。代码我们可以看看addWaiter(Node node)方法:

addWaiter(Node node)先通过快速尝试设置尾节点,如果失败,则调用enq(Node node)方法设置尾节点

在上面代码中,两个方法都是通过一个CAS方法compareAndSetTail(Node expect, Node update)来设置尾节点,该方法可以确保节点是线程安全添加的。在enq(Node node)方法中,AQS通过“死循环”的方式来保证节点可以正确添加,只有成功添加后,当前线程才会从该方法返回,否则会一直执行下去。

cdh yarn 队列_数据结构_02

CLH同步队列遵循FIFO,首节点的线程释放同步状态后,将会唤醒它的后继节点(next),而后继节点将会在获取同步状态成功时将自己设置为首节点,这个过程非常简单,head执行该节点并断开原首节点的next和当前节点的prev即可,注意在这个过程是不需要使用CAS来保证的,因为只有一个线程能够成功获取到同步状态。过程图如下:

cdh yarn 队列_等待状态_03

到此这篇juc阻塞队列(什么叫阻塞队列)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • vconsole是什么意思怎样能删除(如何删除vconsole)2025-10-26 07:27:08
  • ceph的存储类型(ceph支持的存储类型)2025-10-26 07:27:08
  • 颜色代码怎么用(c++颜色代码怎么用)2025-10-26 07:27:08
  • libgdx源码(licode 源码分析)2025-10-26 07:27:08
  • xvwiv是什么牌子(xciv是什么牌子的卫衣)2025-10-26 07:27:08
  • 佳能cp1500和富士小俏印二代哪个好(富士小俏印和佳能1300)2025-10-26 07:27:08
  • console是什么意思演唱会(console什么意思中文)2025-10-26 07:27:08
  • libc.so是什么(libc++abi.so.1)2025-10-26 07:27:08
  • cnn什么意思骂人不带脏字(cnn什么意思的缩写)2025-10-26 07:27:08
  • 泰拉瑞亚时间指令怎么用(泰拉瑞亚指令怎么用pc)2025-10-26 07:27:08
  • 全屏图片