工欲善其事,必先利其器。不管咱们学习什么样的框架或者源码都必须问本身三个问题,它是什么?它能用来作什么?它是怎么作的?本节咱们就带着这三个问题来理解大概。安全
源码中有着大量的注释,可以帮助咱们理解做者的一些设计思路和设计目的,能够帮助咱们更好的理解一些细节实现。框架
基于FIFO等待队列提供了一个实现阻塞锁和其余同步工具的框架。该类为基于一个原子性的int类型状态的同步工具实现提供了通用抽象。实现AQS的子类必须定义父类的protected的方法去改变这个状态,而且定义该状态在获取和释放锁时的具体含义。基于此,该类中的其余方法执行全部排队和阻塞机制。子类能够维护其余状态属性,可是只有经过父类的getState(),setState(),compareAndSetState()方法操做的才会有效.
子类应该被实现为一个非public的内部类来帮助外部类实现同步机制,AQS自己不实现任何同步接口,相反它定义了一些方法来帮助具体的同步工具类实现它们的public方法
AQS支持独占模式或者共享模式也能够都支持。在独占模式下,一个线程获取了许可,其余线程不可能在获取许可。在共享模式下,能够有多个线程获取了许可,若是一个线程获取了许可,下一个等待的线程必须决定是否也须要获取许可。不管是采用什么模式,它们都会在同一个FIFO等待队列上等待,一般来讲子类都只是实现其中的一种模式,但也有例外就是读写锁,它是俩种模式都有的。实现其中一种模式的子类不必去实现它未采用的另外一种模式。
AQS定义了一个内部类ConditionObject,它用来支持独占模式的子类实现,帮助方法isHeldExclusively判断是否当前线程独占等,除了AQS,保证没有其余方法建立这么一个对象,若是你不能知足该约束就不要用AQS。ConditionObject的行为依赖于它的具体同步实现的语义。
AQS提供了等待队列的一些检查,监听等方法,固然条件对象也有。这些方法也能够在同步实现中使用。
AQS序列化只保存state,因此反序列化后等待队列为空。子类应该重写如下方法来实现同步机制,任何对同步state的修改都应该调用getState,setState或者compareAndSetState
<ul> * <li> {@link #tryAcquire} * <li> {@link #tryRelease} * <li> {@link #tryAcquireShared} * <li> {@link #tryReleaseShared} * <li> {@link #isHeldExclusively} * </ul>
上述方法默认都是抛出异常,这些方法的实现必须线程安全,通常来讲不阻塞不长,子类只须要实现这些,AQS中其余方法都已经被声明为final了。