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 星期三