LockSupport

195 阅读1分钟

总结

先上总结,源码部分回头补上。

  • LockSupport内部维持一个permit,取值0/1,初始为0,表示“许可”。
  • park()等待许可,unpark()提供许可。park()消费permit为0,unpark()提供permit为1。
  • unpark()可以在park()之前
  • Thread.interrupt()设置中断标志为true,并调用unpark(),可以将park()唤醒,但不抛出异常。
  • 若中断标志为true,后续执行的park()都不会阻塞,也不会消费permit。
  • 等遇到Thread.sleep()时,异常才会抛出或被捕获。
  • 一次interrupt可以中断一次sleep,中断标志被sleep消费,还可以中断一次park,permit被park消费。
        Thread t1 = new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //不会阻塞 消费一次permit
                LockSupport.park();
                //阻塞
                LockSupport.park();
            }
        });
        t1.start();
        Thread.sleep(1000);
        t1.interrupt();