今天是:
带着程序的旅程,每一行代码都是你前进的一步,每个错误都是你成长的机会,最终,你将抵达你的目的地。
title

AbstractQueuedSynchronizer

概述

提供一个框架,用于实现依赖于先进先出 (FIFO) 等待队列的阻塞锁和相关同步器(信号量、事件等)。此类旨在成为大多数依赖单个原子 int 值来表示状态的同步器的有用基础。子类必须定义更改此状态的受保护方法,以及定义该状态在获取或释放此对象方面的含义。鉴于这些,此类中的其他方法执行所有排队和阻塞机制。子类可以维护其他状态字段,但只有使用方法getState,setState和compareAndSetState操作的原子更新的int值才会被跟踪同步。子类应定义为非公共内部帮助程序类,用于实现其封闭类的同步属性。 类抽象队列同步器不实现任何同步接口。相反,它定义了诸如 acquireInterruptibly 之类的方法,具体锁和相关同步器可以根据需要调用这些方法来实现其公共方法。此类支持默认独占模式和共享模式之一或同时支持。以独占模式获取时,其他线程尝试的获取无法成功。由多个线程获取的共享模式可能会(但不需要)成功。此类不“理解”这些差异,除非在机械意义上,当共享模式获取成功时,下一个等待线程(如果存在)也必须确定它是否可以获取。在不同模式下等待的线程共享相同的 FIFO 队列。通常,实现子类仅支持其中一种模式,但这两种模式都可以发挥作用,例如在 ReadWriteLock 中。仅支持独占模式或仅支持共享模式的子类不需要定义支持未使用模式的方法。此类定义了一个嵌套的 AbstractQueuedSyncr.ConditionObject 类,该类可由支持独占模式的子类用作条件实现,该方法 isHeldExclusive 报告同步是否相对于当前线程以独占方式保持,使用当前 getState 值调用的方法释放完全释放此对象,并在给定此保存的状态值的情况下获取,最终将此对象还原到其先前获取的状态。否则,没有 AbstractQueuedSyncer 方法会创建这样的条件,因此如果无法满足此约束,请不要使用它。AbstractQueuedSyncr.ConditionObject 的行为当然取决于其同步器实现的语义。此类为内部队列提供检查、检测和监视方法,并为条件对象提供类似的方法。这些可以根据需要导出到类中,使用AbstractQueuedSyncr的同步机制。此类的序列化仅存储基础原子整数维护状态,因此反序列化的对象具有空线程队列。需要可序列化性的典型子类将定义一个 readObject 方法,该方法在反序列化时将其还原为已知的初始状态。

同步器的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的 方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些 模板方法将会调用使用者重写的方法。 重写同步器指定的方法时,需要使用同步器提供的如下3个方法来访问或修改同步状态。

·getState():获取当前同步状态。

·setState(int newState):设置当前同步状态。

·compareAndSetState(int expect,int update):使用CAS设置当前状态,该方法能够保证状态 设置的原子性.

 

分享到:

专栏

类型标签

网站访问总量