AbstractQueuedSynchronizer(AQS)—
2020-09-20 本文已影响0人
雁阵惊寒_zhn
AQS做什么的
AbstractQueuedSynchronizer(AQS)是Java中许多同步类的基类,是一个构建锁和同步器的框架,许多同步器都可以通过AQS很容易并且高效地改造出来。
AQS框架实现原理
AQS负责管理同步器类中的状态,管理着一个整数状态信息,可以通过getState()、setState()和compareAndSetState()等方法对state变量进行操作。
/**
* The synchronization state.
*/
private volatile int state;
如果要实现某个同步器,那么需要实现一些保护方法,包括tryAcquire()、tryRelease()、tryAcquireShared()、tryReleaseShared()和isHeldExclusively()等方法。这些方法在子类中重写,并且应该包含对state变量状态改变的操作。
举个例子,ReentrantLock类中非公平锁的实现:
tryAcquire()方法调用的nonfairTryAcquire()尝试获取非公平锁。详细讲解在代码中文注释中。
protected final boolean tryAcquire(int acquires) {
return nonfairTryAcquire(acquires);
}
final boolean nonfairTryAcquire(int acquires) {
//获取当前的线程对象current
final Thread current = Thread.currentThread();
//获取state变量的值,代表当前锁的状态
int c = getState();
//如果state变量的值为0,表明没有线程获得此锁
if (c == 0) {
//比较state值,如果是0,则设置为acquires
if (compareAndSetState(0, acquires)) {
//设置当前线程对象current为锁的所有者
setExclusiveOwnerThread(current);
return true;
}
}
//如果state变量的值不为0,表明已经有线程获得此锁
//判断是否为当前线程拥有此锁
else if (current == getExclusiveOwnerThread()) {
//如果当前线程拥有锁,进入锁,更新state值
int nextc = c + acquires;
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);
return true;
}
//获取锁失败
return false;
}
总结
基于AQS框架可以高效快速地实现自定义的同步器。大多数开发者不会直接使用AQS,标准的同步器类能够满足绝大多数需求,不过如果可以了解AQS框架的实现方式,对于理解同步器的工作原理是非常有帮助的。