LockSupport的park/unpark原理
请解释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优势:
- 不需要同步块:park/unpark无需在synchronized块中调用。
- 精确唤醒:unpark指定线程,notify随机唤醒。
- 顺序灵活:可以先unpark后park,线程不会阻塞。
- 支持中断:park()响应中断,但不会抛出InterruptedException,需自行检测中断标志。
- 超时:parkNanos()支持纳秒级超时。
AQS内部正是使用LockSupport.park/unpark实现线程的阻塞和唤醒。