【发布时间】:2014-08-04 17:52:31
【问题描述】:
notify() 中是否有任何使用作为同步块中的最后一条语句?
例如:假设以下代码在某个线程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();
}
}
}
当Sum类的run()如下:
public void synchronized run() {
for(int i = 1; i <= 55; sum += i++);
// notify();
}
【问题讨论】:
-
我认为您在同步和等待/通知之间感到困惑。它们是相关的,但非常不同。请注意,您不应在 Thread 引用上使用同步或等待/通知,因为实现本身就是这样做的。
-
我的理解是,如果其他人是
wait()ed,您只需要notify(),但是仅在同步块的上下文中,您不需要它除非在你的程序的其他地方你wait()东西 -
@Aaron 在有和没有 notify() 的情况下工作相同,即使该对象上有线程 wait() 。
-
@JonSkeet “实验代码以放置我放置的概念”。试试这个。
-
@user3880721 "即使在该对象上有线程 wait() 时,也可以在有和没有 notify() 的情况下工作。" 你介意发布完整的示例,让我们重现是吗?
标签: java multithreading