AbstractQueuedSynchronizer那些事儿(一) 概述

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

注释翻译

源码中有着大量的注释,能够帮助我们理解作者的一些设计思路和设计目的,可以帮助我们更好的理解一些细节实现。

基于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
    *
  • {@link #tryAcquire} *
  • {@link #tryRelease} *
  • {@link #tryAcquireShared} *
  • {@link #tryReleaseShared} *
  • {@link #isHeldExclusively} *
上述方法默认都是抛出异常,这些方法的实现必须线程安全,一般来说不阻塞不长,子类只需要实现这些,AQS中其他方法都已经被声明为final了。

总结

AQS就是一个帮助实现阻塞锁或者其他同步工具的抽象框架,里面定义了许多方法来帮助同步工具实现其同步语义,它不提供具体的同步实现,而是将同步语义的实现交由子类重写,它支持共享锁或者独占锁。至于它是怎么实现来保证的的我们后续会继续分析。

你可能感兴趣的:(java,并发)