gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:08:40 25 4
gpt4 key购买 nike

目前我正在学习 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 block 消失了。

我的问题是,我是否应该总是更喜欢 LockSupport.park() 而不是 Object.wait()Object.wait() 在性能方面是否优于 LockSupport.park()

最佳答案

wait/notify 背后的想法是通知不是线程特定的,通知者不必知道需要通知的特定线程,它只是告诉锁(或条件,对于 ReentrantLock)它正在通知,以及它们之间的锁和 OS 调度器决定谁得到通知。

我希望大多数时候通知程序不想知道哪个线程需要取消停放,所以对于这些情况,等待/通知将是更好的选择。使用停放/取消停放,您的代码必须知道更多,并且失败的机会也会更多。您可能认为 synchronized block 很乏味,但真正乏味的是整理出某些东西在应该有的时候没有被 unpark 的情况。

请注意,在您的第二个示例中,您的条件需要是易变的或原子的,或者其更新跨线程可见的其他内容。

关于java - `LockSupport.park()` 可以替换 `Object.wait()` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39415636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com