AQS

AQS是Java的一个同步器开发框架,解决的一个最核心问题,就是将高端用户人群和真正意义的底层隔离(JVM的机制和底层的JNI)。一种同步器往往不能解决所有问题,用户经常需要自己实现同步器,这个时候,如果没有AQS,用户就会去用底层的JVM或者映射到JNI的API(例如:LockSupport.park、CAS、Unsafe等等),这种情况会让Java编程变得非常复杂。因此Java提供了AQS,让需要实现同步器的用户在一个同步器框架上编程。

比如下面的程序,就可以让用户轻松的实现一个Mutex(互斥锁)数据结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Mutex {
private final Sync sync = new Sync();
static class Sync extends AbstractQueuedSynchronizer{
protected boolean tryAcquire(int arg) {
return compareAndSetState(0, 1);
}
protected boolean tryRelease(int arg) {
return compareAndSetState(1, 0);
}
}
public void lock(){
sync.acquire(0);
}
public void unlock(){
sync.release(0);
}
}

具体这个程序的含义,我们会在后面讲AQS部分给大家再讲。现在大家可以看到这段程序我们只需要重写tryAcquire 方法就可以实现一个互斥的同步器。 这是因为真实复杂的逻辑被AbstractQueuedSynchronizer给屏蔽了,它为我们实现了同步。