对于以下代码,notifyAll()将保持锁直到完成,即使超时,此块也不会保持锁,必须等待notifyAl()块完成。那么,如果超时完成后,我们仍然需要等待锁,那么等待中的超时(timeout)是什么意思呢?还有-如何更改代码,使超时具有意义?
// one thread
synchronized (lock) {
lock.wait(timeout);
}
// second thread
synchronized (lock) {
// do some processing actions.......
lock.notifyAll();
}
您确实正确,等待线程实际上经历了两种类型的等待:等待显式的"notify/notifyAll",然后等待获得同步锁的机会。
希望大多数其他使用"synchronized"的线程只在短时间内保持同步锁。这是一个非常强烈建议的做法它的一个私有情况是调用"notifyAll"的线程-这是一个非常短的操作,同步块很快就存在了。
总之:线程可能会被"锁定。等待"很长一段时间(例如,"等待客户到达"-这可能需要几个小时,你可能会考虑超时,之后你会对业务感到绝望)。然而,一旦通知到达并在"同步"上进行竞争,这种竞争应该是短暂的,非常短暂,不值得考虑超时。然而,这取决于你的程序员同事的善意,他们应该只对短块使用synchronized(例如,当你更新变量时,避免在那一瞬间出现竞争条件)。这是一个很好的实践。
等待的超时有很好的意义。只要阅读和JavaDoc并思考一下。不知道为什么你认为它在这里没有意义,我想你只是感到困惑。
使当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法,或者经过指定的时间。
当前线程必须拥有此对象的监视器。
Object.wait(long)
在某些情况下,lock.wait()
会等待资源,而资源可能永远不可用(lock.notify()
永远不会被调用)。例如,如果远程计算机崩溃(或网络崩溃),将永远不会收到来自远程计算机的响应。
在这种情况下,一种选择是永远等待,允许用户手动中断等待。
另一种选择是使用lock.wait(timeout)
等待有限的时间,假设资源在该时间到期后不可访问。在这种情况下(超时后),程序可以选择另一种方式来完成任务。或者程序可以简单地退出并允许其他程序执行它们的工作。
在不考虑虚假唤醒的情况下,使用很简单:
if(!condition)
{
lock.wait(timeout);
if(!condition)
{
//timeout expired while waiting
}
}
// 'condition' is true now