AQS

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

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

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给屏蔽了,它为我们实现了同步。