[JUC-2]AbstractQueuedSynchronizer源码分析
AbstactQueuedSynchronizer的基本数据结构
AbstractQueuedSynchronizer的基本数据结构为Node,关于Node,JDK作者写了详细的注释,这里我大致总结几点:
- AbstractQueuedSynchronizer的等待队列是CLH队列的变种,CLH队列通常用于自旋锁,AbstractQueuedSynchronizer的等待队列用于阻塞同步器
- 每个节点中持有一个名为"status"的字段用于是否一条线程应当阻塞的追踪,但是status字段并不保证加锁
- 一条线程如果它处于队列头的下一个节点,那么它会尝试去acquire,但是acquire并不保证成功,它只是有权利去竞争
- 要进入队列,你只需要自动将它拼接在队列尾部即可;要从队列中移除,你只需要设置header字段
下面我用一张表格总结一下Node中持有哪些变量且每个变量的含义:
关于SIGNAL、CANCELLED、CONDITION、PROPAGATE四个状态,JDK源码的注释中同样有了详细的解读,再用一张表格总结一下:
AbstractQueuedSynchronizer供子类实现的方法
AbstractQueuedSynchzonizer是基于模板模式的实现,不过它的模板模式写法有点特别,整个类中没有任何一个abstract的抽象方法,取而代之的是,需要子类去实现的那些方法通过一个方法体抛出UnsupportedOperationException异常来让子类知道。
AbstractQueuedSynchronizer类中一共有五处方法供子类实现,用表格总结一下: