Java并发框架——AQS之如何使用AQS构建同步器

java开源研究 专栏收录该内容
105 篇文章 44 订阅 ¥99.00 ¥79.90

AQS的设计思想是通过继承的方式提供一个模板让大家可以很容易根据不同场景实现一个富有个性化的同步器。同步器的核心是要管理一个共享状态,通过对状态的控制即可以实现不同的锁机制。AQS的设计必须考虑把复杂重复且容易出错的队列管理工作统一抽象出来管理,并且要统一控制好流程,而暴露给子类调用的方法主要就是操作共享状态的方法,以此提供对状态的原子性操作。一般子类的同步器中使用AQS提供的getState、setState、compareAndSetState三个方法,前两个为普通的get和set方法,要使用这两个方法必须要保证不存在数据竞争,compareAndSetState方法提供了CAS方式的硬件级别的原子更新。对于独占模式而言,锁获取与释放的流程的定义则交给acquire和release两个方法,它们定义了锁获取与释放的逻辑,同时也是提供给子类获取和释放锁的接口。它的执行逻辑可以参考前面的“锁的获取与释放”,它提供了一个怎样强大的模板?由下面的伪代码可以清晰展示出来,请注意tryAcquire和tryRelease这两个方法,它就是留给子类实现个性化的方法,通过这两个方法对共享状态的管理可以自定义多种多样的同步器,而队列的管理及流程的控制则不是你需要考虑的问题。
锁获取模板
if(tryAcquire(arg)) {
    创建node
    使用CAS方式把node插入到队列尾部
    while(true){
    if(tryAcquire(arg) 并且 node的前驱节点为头节点){
把当前节点设置为头节点
    跳出循环
}else{
    使用CAS方式修改node前驱节点的waitStatus标识为signal
    if(修改成功)
        挂起

  • 3
    点赞
  • 1
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 代码科技 设计师:Amelia_0503 返回首页

打赏

超人汪小建(seaboat)

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值