gpt4 book ai didi

java - 如果 wait(timeout) 和 notifyAll() 被同一个对象锁定,timeout 是什么意思

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:43:58 24 4
gpt4 key购买 nike

对于下面的代码,notifyAll() 会一直持有锁直到完成,即使超时了,这个 block 也不持有锁,必须等待notifyAll() block 完成。那么wait(timeout)中的timeout是什么意思,如果超时后我们还得等待锁呢?另外 - 如何更改代码以使超时有意义?

// one thread
synchronized (lock) {
lock.wait(timeout);
}

// second thread
synchronized (lock) {
// do some processing actions.......
lock.notifyAll();
}

最佳答案

您确实是正确的,等待线程实际上经历了两种类型的等待:WAITING显式的“notify/notifyAll”,然后等待获得同步锁的机会。

希望是,大多数其他使用“synchronized”的线程只会持有同步锁一小段时间。这是一个非常强烈推荐的做法。 它的一个私有(private)案例是调用'notifyAll'的线程——这是一个非常短的 Action ,并且同步块(synchronized block)很快就存在。

总结:线程可能会在“lock.wait”上停留很长时间(例如“等待客户到达”——这可能需要几个小时,您可能会考虑超时,之后您对业务感到绝望) .然而,一旦通知到达并且它在“同步”上竞争——这个竞争应该是短暂的,如此短暂以至于不值得考虑超时。但是,这取决于您的程序员同事的善意,他们应该只对短 block 使用同步(例如,在更新变量时避免在那几分之一秒内出现竞争条件)。这是一个良好实践的问题。

关于java - 如果 wait(timeout) 和 notifyAll() 被同一个对象锁定,timeout 是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29918268/

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