知识卡片
LockSupport是地基
内容
LockSupport 提供 park/unpark,把线程阻塞唤醒抽成许可证模型:park() 阻塞在任意位置,unpark(thread) 唤醒指定线程,不要求像 [[等待通知须持锁]] 那样先持锁,更适合作为 AQS 底层构件。关键差异:unpark 可在 park 之前调用而不报错(许可被预存),notify 在 wait 之前调用会被丢弃甚至抛异常。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第5章《JUC显式锁的原理与实战》5.1.5节《LockSupport》(源文件:_epub-src/OEBPS/Text/chapter159.xhtml)
- 结论依据:原文说明LockSupport的park/unpark“可以在任意位置阻塞和唤醒”,不像Object.wait()那样“需要在synchronized块中执行”;并通过演示代码证明“线程在没有被LockSupport.park()阻塞之前被LockSupport.unPark()唤醒……不会抛出任何异常,是被允许的”,对比Object.wait()在此场景会抛IllegalMonitorStateException,因此推出本卡结论。
- 原始内容:Object.wait()方法需要在synchronized块中执行,而LockSupport.park()可以在任意地方执行……如果线程在没有被Object.wait()阻塞之前被Object.notify()唤醒……就会抛出IllegalMonitorStateException异常,是不被允许的;而线程在没有被LockSupport.park()阻塞之前被LockSupport.unPark()唤醒……不会抛出任何异常,是被允许的。