park(), unpark(),interrupt(),interrupted()两三事

验证interrupt()会调用unpark():

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

aaa

验证当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住

aaaabbbb

小结:aqs使用interrupted()清空打断标记的目的是,如果后续被unpark()唤醒,但没获取到节点,能够park()住

posted @ 2022-02-10 13:02  GLov  阅读(174)  评论(0)    收藏  举报