park(), unpark(),interrupt(),interrupted()两三事
验证interrupt()会调用unpark():
如果调用,则颁发一次许可证,通过清空中断标记,可以预测park()第一次会消耗许可证,不会成功,第2次成功park(),控制台只输出第一次park()

验证当isInterrupted中断标记为true的时候,park不会成功
Thread test = new Thread(() -> {
Thread.currentThread().interrupt();
LockSupport.park();
System.out.println("第1次park");//park不住,还会执行
Thread.interrupted();//为什么aqs要用interrupted():设置isInterrupted为false,aqs用unpark唤醒,后续才能park住,
LockSupport.park();
System.out.println("第2次park");
if (Thread.currentThread().isInterrupted()) {
System.out.println("通过interrupt唤醒");
} else {
System.out.println("通过unpark唤醒");
}
LockSupport.park();//打断标记为true,无法park;false,可以Park
System.out.println("第3次park");
});
test.start();
Thread.sleep(1000);
LockSupport.unpark(test);//对应false,可以park的情况,aqs用unpark唤醒后
// test.interrupt();//对应true,无法park的情况,aqs selfInterrupt后,无法再次park住
小结:aqs使用interrupted()清空打断标记的目的是,如果后续被unpark()唤醒,但没获取到节点,能够park()住

浙公网安备 33010602011771号