AQS-为什么只有前驱节点是头节点才能尝试获取同步状态

为什么会有这疑问,关键代码如下:
AQS-为什么只有前驱节点是头节点才能尝试获取同步状态
AQS-为什么只有前驱节点是头节点才能尝试获取同步状态
可以发现,p就是当前node节点对象的前驱节点,而只有当p是头节点时,判断才不会短路,才能去尝试获取同步状态。否则的话,就会走shouldParkAfterFailedAcquire()方法:
AQS-为什么只有前驱节点是头节点才能尝试获取同步状态
通过shouldParkAfterFailedAcquire()方法,会让前驱节点不是头节点的节点进入等待。

这时就会有为什么只有前驱节点是头节点才能尝试获取同步状态的疑问了?

  • 因为只有头节点才是成功获取了同步状态的节点,而当头节点释放了同步状态后,头节点会唤醒它的后继节点,同时后继节点的线程被唤醒后还需要检查自己的前驱节点是不是头节点,这是为了保证队列的FIFO规则,防止有节点被中断唤醒,出现插队行为。

总结

为什么只有前驱节点是头节点才能尝试获取同步状态,一是因为只有头节点才能够释放同步状态同时唤醒它的后继节点,二是为了维护同步队列的FIFO规则。