【Java】AQS基本概念

什么是AQS

AQS队列
线程等待队列,一个FIFO的双向队列,队列元素的类型为Node,Node中的thread变量用来存放进入AQS队列里面的线程,waitStatus记录当前线程等待状态。AQS中维护了一个队列,获取锁失败(非tryLock())的线程都将进入这个队列中排队,等待锁释放后唤醒下一个排队的线程(互斥锁模式下)。
共享资源状态
AQS中维持了一个单一的状态信息state,可以通过getState、setState、compareAndSetState函数修改其值
Condition队列
AQS中还有另一个非常重要的内部类ConditionObject,它实现了Condition接口,主要用于实现条件锁。ConditionObject中也维护了一个队列,这个队列主要用于等待条件的成立,当条件成立时,其它线程将signal这个队列中的元素,将其移动到AQS的队列中,等待占有锁的线程释放锁后被唤醒。(eg:Condition典型的运用场景是在BlockingQueue中的实现,当队列为空时,获取元素的线程阻塞在notEmpty条件上,一旦队列中添加了一个元素,将通知notEmpty条件,将其队列中的元素移动到AQS队列中等待被唤醒。)

AQS与锁的区别和联系

AQS是实现锁和其他同步组件的基础框架
AQS是面向锁的实现者,它简化了锁的实现方式,屏蔽了同步状态管理,线程的排队、等待与唤醒等底层操作。
锁是面向使用者,它定义了使用者与锁交互的接口,隐藏了实现细节。
AQS和锁有效的隔离了实现者和使用者所需关注的领域。

AQS实现

第一类:子类实现的方法,AQS不作处理(模板方法)
tryAcquire(int arg):独占获取同步状态,获取同步状态成功后,其他线程需要等待该线程释放同步状态才能获取同步状态。
tryRelease(int arg) 独占式释放同步状态
tryAcquireShared(int arg) 共享式获取同步状态,返回值大于等于0则表示获取成功,否则获取失败。
tryReleaseShared(int arg) 共享式释放同步状态。
isHeldExclusively:当前同步器是否在独占模式下被线程占用,一般该方法表示同步器是否被当前线程独占

第二类:AQS本身的实现的方法,定义给子类通用实现的方法
aquire(int arg):独占式的获取锁的操作,独占式获取同步状态都调用者方法,通过子类的tryAquire方法判断是否获取到锁。
acquireShared(int arg) 共享式的获取锁的操作,在读写锁中用到,通过tryAquireShared方法判断是否获取同步状态
release(int args) 独占式的释放同步状态,通过tryRelease方法判断是否释放了独占式同步状态
releaseShared(int arg):共享式的释放同步状态,通过tryReleaseShared方法判断是否已经释放了共享同步状态。

从使用层面来说,AQS功能分为两种:独占和共享
独占锁,每次只能一个线程持有锁,比如ReentrantLock就是独占锁
共享锁,允许多个线程持有锁,并发访问共享资源,比如ReentrantReadWriteLock
共享锁和独占锁的释放有一定区别,前面部分是一致的,先判断头结点是不是signal状态,如果是则唤醒头节点的下一个节点,并将该节点设置为头结点。而共享锁不一样,某个节点被设置为head之后,如果它的后继节点是shared状态,那么会尝试使用doReleaseShared方法尝试唤醒节点,实现共享状态的传播。
两个核心(同步状态和同步队列)
更改同步状态的三种核心方法
同步队列的结构、如何设置尾节点(需要CAS保证)和头结点(不需要CAS保证)
总结下独占式同步状态的获取和释放:在获取同步状态时,同步器维护一个同步队列,获取状态失败的线程都会被加入到队列中并在队列中进行自旋;移出队列的条件是前驱节点为头节点且成功获取了同步状态。在释放同步状态时,同步器调用tryRelease方法释放同步状态,然后唤醒头节点的后继节点。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值