如何精确唤醒特定挂起线程的 Java LockSupport.unpark() 方法使用技巧?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1068个文字,预计阅读时间需要5分钟。
javaLockSupport.unpark(Thread) 实际上只是给一个 Thread 对象设置了一个 许可(permit)为 1。这不关心线程当前是否挂起、是否在等待、是否已经死亡。如果线程没有调用 LockSupport.park(),这个许可就会静悄悄地保持。如果线程终止,许可会直接丢失;如果线程正在 park() 中,它将立即返回 - 但这与 唤醒逻辑 无关,只是 permit 的基本设置。
换句话说:unpark() 不是“发消息叫醒某人”,而是“往某人衣袋里塞一张入场券”。至于他有没有在门口排队、会不会用、会不会丢,全由他自己决定。
真正影响“谁被唤醒”的关键:park() 的调用时机与线程状态
所谓“精确唤醒”,本质依赖于你能否让目标线程恰好在你调用 unpark() 前进入 park()。否则许可可能提前消耗(比如线程先 park 再 unpark,许可被立即消费),也可能滞后失效(比如先 unpark 再 park,许可还在,但线程可能因其他条件继续阻塞)。
本文共计1068个文字,预计阅读时间需要5分钟。
javaLockSupport.unpark(Thread) 实际上只是给一个 Thread 对象设置了一个 许可(permit)为 1。这不关心线程当前是否挂起、是否在等待、是否已经死亡。如果线程没有调用 LockSupport.park(),这个许可就会静悄悄地保持。如果线程终止,许可会直接丢失;如果线程正在 park() 中,它将立即返回 - 但这与 唤醒逻辑 无关,只是 permit 的基本设置。
换句话说:unpark() 不是“发消息叫醒某人”,而是“往某人衣袋里塞一张入场券”。至于他有没有在门口排队、会不会用、会不会丢,全由他自己决定。
真正影响“谁被唤醒”的关键:park() 的调用时机与线程状态
所谓“精确唤醒”,本质依赖于你能否让目标线程恰好在你调用 unpark() 前进入 park()。否则许可可能提前消耗(比如线程先 park 再 unpark,许可被立即消费),也可能滞后失效(比如先 unpark 再 park,许可还在,但线程可能因其他条件继续阻塞)。

