首页技术文章正文

Java AQS是什么?如何理解AQS?

更新时间:2020-12-08 来源:黑马程序员 浏览量:

1577370495235_学IT就到黑马程序员.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的时候,其实就是两个队列的互相移动。


猜你喜欢:

Spring Cloud Hystrix原理详细介绍

openresty安装使用教程

Java中final关键字如何使用?

Java高级软件工程师培训课程

分享到:
在线咨询 我要报名
和我们在线交谈!