5.2.2 队列同步器的实现分析
1: 同步队列(一个FIFO的双向队列)
(1)设置头节点:是通过获取同步状态成功的线程来完成的,所以不需要使用CAS来保证线程安全。
(2)设置尾节点:加入队列需要保证现场安全,所以同步器提供了一个基于CAS的设置尾节点的方法:compareAndSetTail()
2: 独占式同步状态获取与释放
在获取同步状态时,同步器维护了一个同步队列,获取状态失败的线程都会被加入到队列中并在队列中进行自旋;
移出队列(停止自旋)的条件是前驱节点为头节点且成功获取到了同步状态。在释放同步状态时,同步器调用tryRelease(int arg)方法释放同步状态,然后唤醒头节点的后续节点。
3:共享式同步状态获取与释放
共享式获取与独占式获取主要的区别在于同一个时刻能否有多个线程同时获取到同步状态。
4: 独占式超时获取同步状态
通过调用同步器的doAcquireNanos(int arg,long nanosTimeout)方法可以超时获取同步状态,如果获取到同步状态则返回true,否则返回false.
可以视为响应中断获取同步状态过程的“增强版”,增加了超时获取的特性。