java aqs优点_Java AQS是什么?如何理解AQS?

89f13428de80cb08afbd313899ed528c.gif

AQS(AbstractQueuedSynchronizer类)是一个用来构建锁和同步器的框架,各种Lock包中的锁(常用的有Reentrantlock、ReadWritelock),以及其他如 Semaphore、CountDownlatch,甚至是早期的FutureTask等,都是基于AQS来构建。

1.AQS在内部定义了一个volatile int state变量,表示同步状态:当线程调用lock方法时,如果state=0,说明没有任何线程占有共享资源的锁,可以获得锁并将state=1;如果state=1,则说明有线程目前正在使用共享变量,其他线程必须加入同步队列进行等待。

2.AQs通过Node内部类构成的一个双向链表结构的同步队列,来完成线程获取锁的排队工作,当有线程获取锁失败后,就被添加到队列未尾。

·Node类是对要访问同步代码的线程的封装,包含了线程本身及其状态叫Waitstatus(有五种不同取值,分别表示是否被阻塞,是否等待唤醒,是否已经被取消等),每个Noe结点关联其prev结点和next结点,方便线程释放锁后快速唤醒下一个在等待的线程,是一个FIFO的过程。

·Node类有两个常量,SHARED和CLUSIVE,分别代表共享模式和独占模式。所谓共亨模式是一个锁允许多条线程同时操作(信号量Semaphore就是基于A○S的共享模式实现的),独占模式是同一个时间段只能有一个线程对共享资源进行操作,多余的请求线程需要排队等待(如ReentranLock)。

3.AQS通过内部类Conditionobject构建等待队列(可有多个),当Condition调用Wat()方法后,线程将会加入等待队列中,而当Condition调用signal()方法后,线程将从等待队列转移动同步队列中进锁竟争。

4.AQS和Condition各自维护了不同的队列,在使用Lock和Condition的时候,其实就是两个队列的互相移动。

猜你喜欢:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值