目前,我正在学习Java并发编程。我注意到Java 1.6中引入的LockSupport.park()
比Object.wait()
易于使用,Object.wait()
的典型用法是
// Thread1
synchronized (lock) {
while (condition != true) {
lock.wait()
}
// do stuff
}
// Thread2
synchronized (lock) {
condition = true;
lock.notify();
}
我想我可以使用
LockSupport.park()
重写它,例如// Thread1
while (condition != true) {
LockSupport.park();
}
// do stuff
// Thread2
condition = true;
LockSupport.unpark(Thread1);
通过使用
LockSupport.park()
,乏味的synchroinzed
块消失了。我的问题是,我应该始终喜欢
LockSupport.park()
而不是Object.wait()
吗?在性能方面,Object.wait()
在任何方面都比LockSupport.park()
更好吗? 最佳答案
wait/notify背后的想法是,通知不是特定于线程的,通知者不必知道需要通知的特定线程,它只是告知正在通知的锁(或ReentrantLock的条件),并且锁和它们之间的操作系统调度程序决定谁接收通知。
我希望通知者在大多数时候都不想知道什么线程需要中断,因此等待/通知对于这些情况是一个更好的选择。使用停放/取消停放,您的代码必须了解更多,并且会有更多的失败机会。您可能认为同步块(synchronized block)是乏味的,但是真正要繁琐的工作是找出一些情况,即某些情况下本应保留的东西并没有解散。
请注意,在您的第二个示例中,您的条件需要是 volatile 或原子性的,否则必须在线程间可见其更新。