目前,我正在学习Java中的并发编程。我注意到Java1.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()做得更好的方面,比如性能?
发布于 2016-09-09 16:37:44
等待/通知的思想是通知不是线程特定的,通知程序不需要知道需要通知的特定线程,它只是告诉锁(或条件,对于ReentrantLock)它正在通知,而它们之间的锁和OS调度器决定谁得到通知。
我预计大多数情况下,通知程序都不想知道哪些线程需要取消停车,所以等待/通知将是这些情况下更好的选择。有了公园/卸载,你的代码必须知道更多,将有更多的失败机会。您可能会认为同步块是乏味的,但真正乏味的是找出一些东西本来应该没有停放的情况。
注意,在第二个示例中,您的条件需要是易失性的或原子的,或者是在线程之间可以看到其更新的其他东西。
发布于 2021-01-06 06:06:21
不,Locksupport.park()/unpark()不能替换Object.wait()。
Locksupport.park()/unpark()不要求您获取锁,但是Object.wait()确实要求您使用同步关键字来保护它。我来告诉你为什么,
while (condition != true)
LockSupport.park();在没有同步或其他保护的情况下,其他一些线程可以在这两行代码之间更改条件变量。因此,您的代码可能会在不应该的情况下停放/取消。
https://stackoverflow.com/questions/39415636
复制相似问题