【java】AQS为什么要使用双向链表?

388 篇文章 482 订阅 ¥19.90 ¥99.00

在这里插入图片描述

1.概述

AQS(AbstractQueuedSynchronizer)是 Java 中用于构建同步器的一个基础框架。它在实现同步器时通常使用双向链表的数据结构,主要是为了管理等待线程的队列。以下是为什么要使用双向链表的一些原因:

  1. FIFO(先进先出)顺序:在多线程环境下,要确保公平性和按照线程请求的顺序获取锁,需要使用队列来管理等待线程。双向链表可以很容易地支持FIFO顺序,因为它可以在队列的前端和后端进行高效的插入和删除操作,确保线程按照它们请求锁的顺序进行处理。

  2. 高效的入队和出队操作:双向链表的结构允许在队列的头部和尾部快速进行元素的插入和删除操作,而不需要遍历整个队列。这对于高度并发的情况下非常重要,因为在这种情况下,需要尽量减小对队列的操作所带来的性能开销。

  3. 支持条件等待:AQS 不仅用于互斥锁(如 ReentrantLock)的实现,还支持条件等待(Condition)。条件等待需要能够高效地将线程从条件队列移动到主等待队列,并在条件满足时移回条件队列。双向链表可以支持这种操作,因为它们允许线程在队列之间移动。

  4. 易于管理等待线程状态:AQS 使用了一个内部类 Node 来表示等待队列中的节点,这些节点通过双向链表连接。这些节点可以很容易地跟踪线程的状态,例如,是否已被取消、是否被中断等。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九师兄

你的鼓励是我做大写作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值