扫码关注微信公众号
回复“面试手册”,获取本站PDF版
回复“简历”,获取高质量简历模板
回复“加群”,加入程序员交流群
回复“电子书”,获取程序员类电子书
AQS的全称是AbstractQueuedSynchronizer
,是一个用来构建锁和同步器的框架,像ReentrantLock,Semaphore,FutureTask都是基于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);
}
本站链接:https://www.mianshi.online,如需勘误或投稿,请联系微信:lurenzhang888
点击面试手册,获取本站面试手册PDF完整版