AbstractQueuedSynchronizer

2020-05-13  本文已影响0人  momdiemg

提供了实现阻塞锁和相关同步器依靠先入先出(FIFO)等待队列(信号量,事件等)的框架. 此类设计对于大多数种类的依赖于一个单一的原子同步的一个有益的基础int值来表示状态。 子类必须定义protected方法用来改变状态,并且子类定义state字段的意义是什么,就该对象的acquired或者released而言。鉴于这些,类里面的其他方法完成所有的排队和阻塞机制。子类可以保留其他的状态字段,但是有原子更新的int值被操纵,通过使用getState,setState和compareAndSetState来同步追踪
子类应该被定义再一个非公的内部类,被用来实现当前类的同步器属性。AbstractQueuedSynchronizer没有实现任何接口。取而代之的是,它定义了比如acquireInterruptibly()方法,就能被适当的调用通过正确的锁,和有关同步器去实现他们的公共方法。
这个类不但支持独有,还支持共享。当在独有模型里面acquired(获得锁),其他试图获得锁的线程就不会成功。共享模型可能有多个线程获得锁。这个类不被理解的是,除了机械意义上的不同,就是当一个共享模型获取成功,下一个等待线程必须也确定是否他们也能获取。通常实现的子类只支持一种模型,但是两者都可以发挥作用(例如ReadWriteLock,读可以共享,写可以独占)。
这个类定义了一个嵌套的ConditionObject类,此类能被用来作为一个Condition的实现,通过子类支持的独占模型,为了实现之前,方法isHeldExclusively()报告,来判断是否该同步化是独占的被持有相对于当前线程.release()方法的调用伴随着当前getState()方法的值完全的释放了这个对象,方法acquire(),被提供用来保存state的值,并最终回复这个对象到他之前的获取状态。ConditionObject的行为当然依赖于同步器实现的语义
此类提供检查,仪器仪表,以及用于内部队列监测方法,以及用于条件对象类似的方法。 根据需要进使用这些类可以导出AbstractQueuedSynchronizer用于它们的同步机制。
这个类存储的序列化只是底层原子整数保持状态,所以反序列化对象拥有空的线程队列。 需要串行化典型子类将定义readObject使得在反序列化此恢复到一个已知的初始状态的方法

用法
作为一个基本的同步器来使用这个类,重定义下面的方法,作为可适用的,通过使用getState,setState,compareAndSetState检查 或 修改同步器状态.
每个方法默认的会抛出UnsupportedOperationException异常,这些方法的实现必须保证内部的线程安全,并且在一般应短而不会阻塞。 定义这些方法是使用此类的唯一支持的手段。 其他所有方法都被声明final ,因为它们不能独立地变化。
尽管这个类基于内部的FIFO队列,但他没法自动的执行FIFO的获取策略,核心的独占同步器采取一下策略
Acquire:
*     while (!tryAcquire(arg)) {
*         enqueue thread if it is not already queued ;
*         possibly block current thread ;
*     }
*
* Release:
*     if (tryRelease(arg))
*          unblock the first queued thread ;

上一篇下一篇

猜你喜欢

热点阅读