LockSupport.park 与 Object.wait 的方法的区别?
LockSupport.park()与Object.wait()的核心区别是是否依赖锁对象:park()是无锁阻塞,不依赖任何对象;wait()必须在synchronized代码块中调用,强制依赖锁对象。
具体差异主要有四点:
-
使用前提:wait()必须在同步代码块(synchronized修饰)中调用,否则抛IllegalMonitorStateException;park()无任何前提,可在任意地方调用。
-
唤醒方式:wait()需通过对应锁对象的notify()/notifyAll()唤醒;park()需通过LockSupport.unpark(Thread)主动给线程“许可”唤醒。
-
锁释放行为:wait()调用时会主动释放持有的锁对象,让其他线程有机会获取;park()阻塞时不释放任何锁(本身也不持有锁)。
-
中断响应:两者被中断都会抛出InterruptedException,但park()被中断后不清除中断状态,wait()会清除中断状态。