在notify()
中使用任何作为同步&#d; d块中的最后一个语句?
例如:假设以下代码在某个线程r
中运行,
synchronized(t) {
t.start();
// do stuff using t
t.notify();
}
如果我删除该线,我会松开什么?
t.notify();
线程r
已经释放了t
的锁,并且等待它的人可以使用此锁。
我工作过的代码示例"表现良好"有和没有t.notify()
调用的那个相同。
我能想到的唯一用途是,有点"积极主动"通知t
的监视器正在被释放,等待它的人将进入BLOCKED
状态,等待获取它。
但是,在这种情况下,notify()
是同步块中的最后一个语句,JVM通过退出同步块已经知道该锁已被释放。
这是关于理解notify()
&的某些细节的问题。 notifyAll()
。
TIA。
请注意:我看过Java notify() run before wait()?和Does the position of the notify() call matter?(Java)。这是一个与那些不同的Q.
// ================================
编辑:示例代码:
public class T3 {
public static void main(String[] args){
Sum t = new Sum();
synchronized(t) {
t.start();
try {
t.wait();
} catch (InterruptedException ex) {
}
}
System.out.println("Sums up to: " + t.sum);
} // main
}
class Sum extends Thread {
int sum;
public void run() {
synchronized(this) {
for(int i = 1; i <= 55 ; sum += i++);
// notify();
}
}
}
类run()
的{{1}}如下所示:
Sum
答案 0 :(得分:1)
是。它允许wait()
t
上的其他线程再次运行,而不是等待永远不会发出的通知。
答案 1 :(得分:1)
如果你锁定一个线程,并且该线程终止,它会向任何等待它的线程发送notifyAll。请参阅API documentation for Thread.join:
此实现使用this.wait调用on.isAlive的循环。当一个线程终止时,将调用this.notifyAll方法。建议应用程序不要在Thread实例上使用wait,notify或notifyAll。
在您的示例中,通知是在线程完成执行之前完成的最后一件事,因此显式通知是多余的。
(请注意,此处引用的API文档和Jon Skeet都建议您不要锁定线程对象。)