CodeWalk

LockSupport的park/unpark原理

作者:我是大山 · 2026-05-30 12:55

请解释LockSupport的park()和unpark()的工作原理,与Object.wait/notify相比有何优势?

回答

我是大山

LockSupport

  • 基于Unsafe类的park/unpark native方法,底层依赖POSIX的pthread_cond_wait/pthread_mutex。
  • 每个线程关联一个许可(permit),类似信号量但最多为1。

park()

  • 如果许可证可用(permit=1),消耗许可证立即返回。
  • 如果许可证不可用(permit=0),线程阻塞。

unpark(Thread t)

  • 给指定线程发放一个许可证(permit设为1)。
  • 如果线程已park,直接唤醒。
  • 如果未park,下一次park立即返回。

与Object.wait/notify优势

  1. 不需要同步块:park/unpark无需在synchronized块中调用。
  2. 精确唤醒:unpark指定线程,notify随机唤醒。
  3. 顺序灵活:可以先unpark后park,线程不会阻塞。
  4. 支持中断:park()响应中断,但不会抛出InterruptedException,需自行检测中断标志。
  5. 超时:parkNanos()支持纳秒级超时。

AQS内部正是使用LockSupport.park/unpark实现线程的阻塞和唤醒。