简析JUC中的LockSupport

LockSupport简介

LockSupport工具类用来挂起和唤醒线程,底层使用Unsafe类实现,其最核心的方法是park和unpark:

  • park:该方法用来阻塞线程。如果调用park方法的线程拿到了permit,则park方法立即返回;如果没有拿到permit,则该线程阻塞。
    public static void park() {
        UNSAFE.park(false, 0L);
    }

  • unpark:该方法用来唤醒线程。如果调用unpark方法的线程没有拿到permit,则让该线程持有permit。如果该线程被park方法挂起,则唤醒该线程。
    public static void unpark(Thread thread) {
        if (thread != null)
            UNSAFE.unpark(thread);
    }

permit是Unsafe类中native方法park和unpark中的一个概念,类似于一个只有0和1两个值的信号量,这里我们不去深究,只要熟悉LockSupport中park和unpark方法的行为即可。

park/unpark和Object中wait/notify区别

  • wait必须在synchronized代码块中执行,park可以在任何地方执行
  • wait必须捕获中断异常,而park不需要
  • wait不带有超时功能,而parkNanos等方法可以有
  • notify不能指定唤醒的线程,而park可以
  • 如果在wait之前执行了notify,会抛出IllegalMonitorStateException异常;但在park之前执行了unpark,不会有影响,park会直接返回

总之,LockSupport强过wait/notify千万倍,用LockSupport就对了!


每日学习笔记,写于2020-05-06 星期三

你可能感兴趣的:(简析JUC中的LockSupport)