工欲善其事,必先利其器。无论咱们学习什么样的框架或者源码都必须问本人三个问题,它是什么?它能用来做什么?它是怎么做的?本节咱们就带着这三个问题来了解大略。

一 正文翻译

源码中有着大量的正文,可能帮忙咱们了解作者的一些设计思路和设计目标,能够帮忙咱们更好的了解一些细节实现。

基于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了。