抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

思维导图

文章已收录Github精选,欢迎Starhttps://github.com/yehongzhi/learningSummary

一、什么是AQS

谈到并发编程,不得不说AQS(AbstractQueuedSynchronizer),这可谓是Doug Lea老爷子的大作之一。AQS即是抽象队列同步器,是用来构建Lock锁和同步组件的基础框架,很多我们熟知的锁和同步组件都是基于AQS构建,比如ReentrantLock、ReentrantReadWriteLock、CountDownLatch、Semaphore。

实际上AQS是一个抽象类,我们不妨先看一下源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public abstract class AbstractQueuedSynchronizer extends AbstractOwnableSynchronizer implements java.io.Serializable {
//头结点
private transient volatile Node head;
//尾节点
private transient volatile Node tail;
//共享状态
private volatile int state;

//内部类,构建链表的Node节点
static final class Node {
volatile Node prev;
volatile Node next;
volatile Thread thread;
}
}
//AbstractQueuedSynchronizer的父类
public abstract class AbstractOwnableSynchronizer implements java.io.Serializable {
//占用锁的线程
private transient Thread exclusiveOwnerThread;
}

由源码可以看出AQS是有以下几个部分组成的:

1.1 state共享变量

AQS中里一个很重要的字段state,表示同步状态,是由volatile修饰的,用于展示当前临界资源的获锁情况。通过getState(),setState(),compareAndSetState()三个方法进行维护。

1
2
3
4
5
6
7
8
9
10
11
12
private volatile int state;

protected final int getState() {