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

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

大家好,我是讯享网,很高兴认识大家。



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

小讯
上一篇 2025-04-18 13:50
下一篇 2025-06-07 14:14

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/185390.html