AQS(AbstractQueuedSynchronizer)是Java中用于构建同步器的框架,它提供了一种实现各种同步器的通用框架,例如ReentrantLock、Semaphore、CountDownLatch等等。
AQS框架的核心思想是使用一个双向链表来维护等待线程队列,同时使用一个状态变量来表示当前同步器的状态。当线程请求获取同步器的锁时,如果同步器已经被占用,那么线程就会被加入等待队列中,并阻塞自己,等待被唤醒;如果同步器未被占用,则线程直接获取同步器的锁,并将同步器的状态设置为“已占用”。
下面是一个简单的示例,演示了如何使用 AQS 框架来实现一个简单的计数器:
import java.util.concurrent.locks.AbstractQueuedSynchronizer;
public class Counter {
private final Sync sync = new Sync();
public void increment() {
sync.acquire(1);
try {
// 进行计数器加一操作
} finally {
sync.release(1);
}
}
public int getCount() {
return sync.getCount();
}
private static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 1L;
protected boolean tryAcquire(int arg) {
return compareAndSetState(0, arg);
}
protected boolean tryRelease(int arg) {
int c = getState() - arg;
if (c == 0) {
return true;
}
if (c < 0) {
throw new IllegalStateException("Counter underflow");
}
setState(c);
return false;
}
public int getCount() {
return getState();
}
}
}
在上面的示例中,Counter类包含一个Sync类的实例,它继承了AbstractQueuedSynchronizer并实现了 tryAcquire()、tryRelease()方法。increment()方法首先尝试获取同步器的锁(即调用 acquire() 方法),然后进行计数器加一操作,最后释放同步器的锁(即调用release() 方法)。getCount()方法返回当前计数器的值,即同步器的状态。