AQS

目录

 

AQS 是什么

AQS 的两种功能

AQS 的内部实现 (node)

Node 的组成 

释放锁以及添加线程对于队列的变化 


AQS 是什么

在 Lock 中,用到了一个同步队列 AQS,全称 AbstractQueuedSynchronizer,它 是一个同步工具也是 Lock 用来实现线程同步的核心组件。如果你搞懂了 AQS,那 么 J.U.C 中绝大部分的工具都能轻松掌握。

AQS 的两种功能

从使用层面来说,AQS 的功能分为两种:独占和共享

独占锁,每次只能有一个线程持有锁,比如前面给大家演示的 ReentrantLock 就是 以独占方式实现的互斥锁

共 享 锁 , 允 许 多 个 线 程 同 时 获 取 锁 , 并 发 访 问 共 享 资 源 , 比 如 ReentrantReadWriteLock

AQS 的内部实现 (node)

AQS 队列内部维护的是一个 FIFO 的双向链表,这种结构的特点是每个数据结构 都有两个指针,分别指向直接的后继节点和直接前驱节点。所以双向链表可以从任 意一个节点开始很方便的访问前驱和后继。每个 Node 其实是由线程封装,当线 程争抢锁失败后会封装成 Node 加入到 ASQ 队列中去;当获取锁的线程释放锁以 后,会从队列中唤醒一个阻塞的节点(线程)。 

Node 的组成 

释放锁以及添加线程对于队列的变化 

a)当出现锁竞争以及释放锁的时候,AQS 同步队列中的节点会发生变化,首先看一 下添加节点的场景 

这里会涉及到两个变化

1. 新的线程封装成 Node 节点追加到同步队列中,设置 prev 节点以及修改当前节 点的前置节点的 next 节点指向自己

2. 通过 CAS 讲 tail 重新指向新的尾部节点 

b)head 节点表示获取锁成功的节点,当头结点在释放同步状态时,会唤醒后继节点, 如果后继节点获得锁成功,会把自己设置为头结点,节点的变化过程如下 

这个过程也是涉及到两个变化

1. 修改 head 节点指向下一个获得锁的节点

2. 新的获得锁的节点,将 prev 的指针指向 null

设置 head 节点不需要用 CAS,原因是设置 head 节点是由获得锁的线程来完成 的,而同步锁只能由一个线程获得,所以不需要 CAS 保证,只需要把 head 节点 设置为原首节点的后继节点,并且断开原 head 节点的 next 引用即可 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值