AQS依赖于一个FIFO队列和一个int表示的状态. 具体的实现类可以自己去保存别的状态, 但是只有这个int表示的状态是require和release的, 子类自己的状态是做辅助作用的.
我们的同步器应该是通过把AQS的子类作为一个内部的代理类来实现,最好不要直接继承AQS,因为AQS的一些api最好不要暴露出去,容易被误用.
AQS可以同时用来实现共享和非共享同步器. 他们共用一个FIFO queue
AQS内部的ConditionObject类的作用是提供 Condition的作用
对AQS的序列化只会序列化内部的int表示的状态,不会序列化queue,所以要想序列化,最好自己去做这方面的工作.
想要使用AQS来作为一个同步器的基类,需要实现下面这几个方法.可以通过getState setState compareAndSetState 这些方法来对状态进行监控和修改
* <li> {@link #tryAcquire}
* <li> {@link #tryRelease}
* <li> {@link #tryAcquireShared}
* <li> {@link #tryReleaseShared}
* <li> {@link #isHeldExclusively}
这些方法默认都是仍一个异常,这些方法的实现需要保证线程安全,一般需要最好比较短而且没有阻塞操作. 只要实现这些方法就好了, 其它方法都是final的.