wait/notify与park/unpark对比
请对比Object.wait/notify和LockSupport.park/unpark在用法、灵活性和安全性方面的差异。
回答
苦行僧
| 特性 | Object.wait/notify | LockSupport.park/unpark |
|---|---|---|
| 前置条件 | 必须在synchronized块中 | 无需同步块 |
| 通知对象 | notify随机唤醒一个,notifyAll唤醒全部 | unpark精确唤醒指定线程 |
| 调用顺序 | wait必须先于notify,否则线程永远等待 | unpark可以先于park,线程不会阻塞(许可证机制) |
| 中断处理 | 抛出InterruptedException | 不抛异常,通过Thread.interrupted()检测 |
| 超时 | wait(timeout)毫秒级 | parkNanos()纳秒级 |
| 虚假唤醒 | 可能出现,需while循环判断 | 可能出现,需循环条件判断 |
| 可用性 | 所有Java对象内置 | 需LockSupport类 |
选择建议:简单场景用wait/notify;需要精确唤醒、灵活控制或非synchronized场景用LockSupport。AQS内部使用LockSupport。