首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >`LockSupport.park()`可以替换`Object.wait()`吗?

`LockSupport.park()`可以替换`Object.wait()`吗?
EN

Stack Overflow用户
提问于 2016-09-09 16:06:21
回答 2查看 1.2K关注 0票数 2

目前,我正在学习Java中的并发编程。我注意到Java1.6中引入的LockSupport.park()Object.wait()容易得多,典型的Object.wait()用法如下

代码语言:javascript
复制
// Thread1
synchronized (lock) {
    while (condition != true) {
        lock.wait()
    }

    // do stuff
}

// Thread2
synchronized (lock) {
    condition = true;
    lock.notify();
}

我想我可以用LockSupport.park()重写它

代码语言:javascript
复制
// 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()做得更好的方面,比如性能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-09 16:37:44

等待/通知的思想是通知不是线程特定的,通知程序不需要知道需要通知的特定线程,它只是告诉锁(或条件,对于ReentrantLock)它正在通知,而它们之间的锁和OS调度器决定谁得到通知。

我预计大多数情况下,通知程序都不想知道哪些线程需要取消停车,所以等待/通知将是这些情况下更好的选择。有了公园/卸载,你的代码必须知道更多,将有更多的失败机会。您可能会认为同步块是乏味的,但真正乏味的是找出一些东西本来应该没有停放的情况。

注意,在第二个示例中,您的条件需要是易失性的或原子的,或者是在线程之间可以看到其更新的其他东西。

票数 6
EN

Stack Overflow用户

发布于 2021-01-06 06:06:21

不,Locksupport.park()/unpark()不能替换Object.wait()。

Locksupport.park()/unpark()不要求您获取锁,但是Object.wait()确实要求您使用同步关键字来保护它。我来告诉你为什么,

代码语言:javascript
复制
while (condition != true) 
  LockSupport.park();

在没有同步或其他保护的情况下,其他一些线程可以在这两行代码之间更改条件变量。因此,您的代码可能会在不应该的情况下停放/取消。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39415636

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档