park(Object blocker) 和 unpark(Thread thread) 方法位于Java 并发包下的 java.util.concurrent.locks.LockSupport 类,本质上是对 Unsafe 的 park/unpark 方法的简单封装,它是 Lock(AQS)的基石,给 Lock(AQS)提供了挂起/恢复当前线程的能力。
基本使用
// 暂停当前线程
LockSupport.park();
// 恢复某个线程的运行
LockSupport.unpark(暂停线程对象)
public static void main(String[] args) throws Exception {
Thread t1 = new Thread(() -> {
log.info("开始");
Thread.sleep(1000);
log.info("park");
LockSupport.park();
log.info("结束");
}, "t1");
t1.start();
Thread.sleep(1000);
log.info("unpark");
LockSupport.unpark(t1);
}
与 Object 的 wait & notify 相比
- park & unpark 可以“阻塞”和“唤醒”指定线程
- notify 只能随机唤醒一个等待线程,notifyAll是唤醒所有等待线程
park/unpark 原理总结
每个线程都会关联一个 Parker 对象,每个 Parker 对象都各自维护了三个角色:计数器、互斥量、条件变量。
park 操