1、源码
获取锁
获取锁入队方法
阻塞当前线程
2、解析
当线程获取失败进入队列阻塞后,从parkAndCheckInterrupt方法被唤醒有可能是前一个线程释放锁唤醒,也有可能是被其他线程中断唤醒,如果是中断唤醒那么Thread.interrupted()方法会返回true,并把线程中断标志位清除,如果parkAndCheckInterrupt返回true,最终会被acquiredQueued方法传递出去,acquire方法判断就会为true,就会执行selfInterrupt方法。这就是为什么要传递中断标志位的原因。当一个线程因为没有获取到锁阻塞被异常中断唤醒,设计者又不想让异常中断打断获取锁(lock)的过程,所以只能让将中断标志位传递出去,获取锁最后根据传递的中断标志是否是true,执行一次selfInterrupt方法将中断标志重新设置成true,业务代码可以根据这个标志去执行相应的逻辑。