扫码关注微信公众号

回复“面试手册”,获取本站PDF版

回复“简历”,获取高质量简历模板

回复“加群”,加入程序员交流群

回复“电子书”,获取程序员类电子书

当前位置: Java > Java并发高频面试题 > 71.什么是AQS?AQS的原理是什么?

AQS的全称是AbstractQueuedSynchronizer,是一个用来构建锁和同步器的框架,像ReentrantLock,Semaphore,FutureTask都是基于AQS实现的。

简单来说,AQS就是维护了一个共享资源,然后使用队列来保证线程排队获取资源的一个过程。

AQS的原理图如下:

AQS原理图
AQS原理图

AQS的工作流程:当被请求的共享资源空闲,则将请求资源的线程设为有效的工作线程,同时锁定共享资源。如果被请求的资源已经被占用了,AQS就用过队列实现了一套线程阻塞等待以及唤醒时锁分配的机制。

这个队列是通过CLH队列实现的,从上图可以看出,该队列是一个双向队列,有Node结点组成,每个Node结点维护一个prev引用和next引用,这两个引用分别指向自己结点的前驱结点和后继结点,同时AQS还维护两个指针Head和Tail,分别指向队列的头部和尾部。

从上图可以看出,AQS是维护了一个共享资源和一个FIFO的线程等待队列。

private volatile int state;  

通过volatile来保证state的线程可见性,state的访问方式主要有三种,如下

protected final int getState() {               //获取state的值
    return state;
}

protected final void setState(int newState) {   //设置state的值
    state = newState;
}

protected final boolean compareAndSetState(int expect, int update) {       //通过CAS操作更新state的值
    return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}

点击面试手册,获取本站面试手册PDF完整版