【发布时间】:2013-01-17 23:51:15
【问题描述】:
这不是Java, Multithreading with synchronized methods 的重复...他没有问同样的问题。
我正在尝试编写一个使用多线程和死锁的程序。我无法理解在同步方法中如何以及在何处使用 wait() 和 notify() 以使线程等待并使用 notify() 将其唤醒。我有它让第一个线程在 ping 语句之后等待,以便下一个线程也将启动它的 ping 语句。但是我有一个 notify() 来唤醒第一个线程,但我不知道为什么线程不会唤醒。以下是我的输出:
Starting...1
Girl (ping): pinging Boy
Boy (ping): pinging Girl
Girl (ping): asking Boy to confirm
Boy (confirm): confirm to Girl
Girl (ping): got confirmation
Boy (ping): asking Girl to confirm
Girl (confirm): confirm to Boy
Boy (ping): got confirmation
我的代码死锁了,或者我没有正确使用等待和通知,因为它停在这里:
Starting...1
Girl (ping): pinging Boy
Boy (ping): pinging Girl
Girl (ping): asking Boy to confirm
Boy (confirm): confirm to Girl
Girl (ping): got confirmation
这是我的代码:
Monitor.java
class Monitor {
String name;
public Monitor (String name) { this.name = name; }
public String getName() { return this.name; }
public synchronized void ping (Monitor p) {
p.release(p);
System.out.println(this.name + " (ping): pinging " + p.getName());
notify();
try { wait(); } catch (Exception e) {}
System.out.println(this.name + " (ping): asking " + p.getName() + " to confirm");
p.confirm(p);
System.out.println(this.name + " (ping): got confirmation");
}
public synchronized void confirm (Monitor p) {
System.out.println(this.name + " (confirm): confirm to " + p.getName());
}
public synchronized void release (Monitor p) {
notify();
}
}
Runner.java
public class Runner extends Thread {
Monitor m1, m2;
public Runner (Monitor m1, Monitor m2) {
this.m1 = m1;
this.m2 = m2;
}
public void run () {
m1.ping(m2);
}
}
死锁.java
public class DeadLock {
public static void main (String args[]) {
int i=1;
System.out.println("Starting..."+(i++));
Monitor a = new Monitor("Girl");
Monitor b = new Monitor("Boy");
(new Runner(a, b)).start();
(new Runner(b, a)).start();
}
}
【问题讨论】:
-
A
deadlock是程序(或至少一些线程)停止运行,因为它们每个都在等待另一个释放资源。你确定你的意思是你希望你的程序有死锁吗? -
不,我不希望它陷入僵局,对不起,如果我有点罗嗦。我试图避免死锁,并让线程等待并使用通知唤醒以获得我想要的输出。
-
代码很奇怪......我的意思是,在
ping你this.notify()(因为线程没有等待而没有效果)然后this.wait()停止线程。另一个线程也一样,所以两个线程最终都在等待另一个线程唤醒。你确定第一行不是synchronized (p) {p.notify();}。wait应该在同步块内,如果我是对的(现在有点太困了)。
标签: java multithreading deadlock