乐趣区

关于java: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

<ul>
 * <li> {@link #tryAcquire}
 * <li> {@link #tryRelease}
 * <li> {@link #tryAcquireShared}
 * <li> {@link #tryReleaseShared}
 * <li> {@link #isHeldExclusively}
 * </ul>

上述办法默认都是抛出异样,这些办法的实现必须线程平安,一般来说不阻塞不长,子类只须要实现这些,AQS 中其余办法都曾经被申明为 final 了。

退出移动版