美文网首页
AQS双向链表

AQS双向链表

作者: nieniemin | 来源:发表于2021-09-03 14:36 被阅读0次

双向链表的每个数据节点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点(head)和后继结点(tail)。

AQS实际上通过头尾指针来管理同步队列,同时实现包括获取锁失败的线程进行入队,释放锁时对同步队列中的线程进行通知等核心方法。

一、添加节点

  1. 如果队列为空,会初始化队列。
    第一个加进来的新节点既是头也是尾,前后都没有节点。


    初始化队列
  1. 新增一个节点
    添加节点会涉及到三个变化:
  • 新的线程封装成Node节点追加到同步队列中,设置prev节点以及修改当前节点的前置节点的next节点指向自己
  • 通过CAS讲tail重新指向新的尾部节点
    -头节点会更新waitStatus为-1


    新增一个节点-线程t1
新增节点-线程t2

二、移除节点

我们以下图来介绍下等待队列时如何移除节点的。如图中所示队列中有t1,t2两个线程。假设此时持有锁的线程t0释放锁unlock。那么队列中线程移除步骤如下:

  • 线程先释放state资源
  • 通过 unparkSuccessor 唤醒head的后继节点,因为后继节点有可能进入了waitting状态,将waitStatus值设为0.
  • 判断node的后继节点next是否有效,如果无效,则从队列的tail节点开始往前遍历,直到找到第一个有效的节点
  • 唤醒线程后,在acquireQueued自旋获取锁,头节点移除队列,获取锁的节点设置为头。
移除节点前状态 移除节点

相关文章

  • AQS双向链表

    双向链表的每个数据节点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方...

  • AQS原理剖析

    AQS结构剖析 双向链表 + waitStatus的int值 锁的结构: 实现Lock接口 组合AQS进行并发状态...

  • Java面试——多线程与并发

    CAS的原理 AQS等待队列为什么设计成双向链表? juc包下知道哪些类? AQS,ReentrantLock,R...

  • 慕课网高并发实战(七)- J.U.C之AQS

    7.1 AbstractQueuedSynchronizer -AQS 底层实现了双向链表,是队列的一种实现方式 ...

  • 双向链表&双向循环链表

    链表分为:单链表、单向循环链表、双向链表、双向循环链表本节主要说明:双向链表、双向循环链表 定义结点 一、双向链表...

  • 线性表-双向链表与双向循环链表

    双向链表 双向链表示意图如下: 数据结构定义 创建双向链表 双向链表插入元素 双向链表删除元素 双向链表打印元素 ...

  • 13. ConcurrentLinkedQueue/Deque

    AQS内部的阻塞队列实现原理:基于双向链表,通过对head/tail进行CAS操作,实现入队和出队。 Concur...

  • Day 29 AQS

    AQS 具备特性 阻塞,等待独占,共享公平,非公平可重入允许中断. . 同步等待队列clh,双向链表构筑的队列 条...

  • day03-双向链表

    双向链表: 单向链表只能单向查找,双向链表可以双向查找。 啥是双向链表? 双向链表可以双向查数据,所以就不存在单向...

  • 线性表--链式存储结构--双向链表

    双向链表 一、双向链表结构 双向链表结点结构 既然单链表可以有循环链表,那么双向链表当然也可以有。 由于这是双向链...

网友评论

      本文标题:AQS双向链表

      本文链接:https://www.haomeiwen.com/subject/hbrkwltx.html