java并发编程的艺术(六)-----AQS

本文深入探讨了Java并发编程中的AQS(AbstractQueueSynchronizer),介绍了AQS的核心思想——基于volatile state属性实现同步状态的管理,以及如何通过FIFO同步队列解决羊群效应。详细讲解了AQS的实现,包括同步队列的结构,独占式同步状态的获取与释放源码分析,并讨论了独占式超时获取同步状态的机制。
摘要由CSDN通过智能技术生成

是什么?

AQS是队列同步器(AbstractQueueSynchronizer),是用来构建锁和完成其他同步组件的基本框架,再lock里面,很多的方法都将用到AQS以获取同步状态,实现锁的语义,而不是依靠传统的synchronized中的对象进行锁获取与释放。

AQS的核心思想

AQS的核心思想是基于volatile int state这样的一个属性同时配合Unsafe工具对其原子性的操作来实现对当前锁的状态进行修改。当state的值为0的时候,标识改Lock不被任何线程所占有

AQS如何解决“羊群效应”

“羊群效应”指的是很多的线程在竞争同一个资源或锁的时候,最后只能由一个线程获得锁,这个获取资源或锁的过程中,就会造成资源的浪费。
AQS采用一个FIFO的同步队列的数据结构,每个节点只需要关心上一个前驱节点的状态,线程唤醒也只唤醒头节点中等待的线程。与其让这些线程相互竞争,还不如它们安排好顺序一个一个来。

AQS的实现

同步队列

之前说的,AQS是采用的一中FIFO队列的数据结构,同步队列的指针里面包含指向头节点和伪结点的指针。而每个节点都是用来保存竞争线程的状态和信息的,节点的主要成员变量如下:

Node {
    int waitStatus;
    Node prev;
    Node next;
    Node nextWaiter;
    Thread thread;
}

独占式同步状态的获取与释放

  • 在获取同步状态的时候,同步器会维护一个同步队列,若获取成功,则直接退出acquire方法;若获取同步状态失败,就会将当前线程的信息添加到同步对列的队尾并在该队列中进行自旋以获得同步状态之后才退出acquire方法。
    这里写图片描述


  • 在释放同步状态的时候有,同步器会调用tryRelease方法释放通过不状态,接着唤醒同步队列中头节点的后继节点。

独占式同步状态的获取与释放源码分析

独占式同步状态的获取源码分析

//通过acquire方法获取同步状态,里面调用由子类实现的tryAcquire方法
//若获取失败就将该线程加入同步队列中继续自旋获取同步状态
public final void 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值