【发布时间】:2016-05-04 20:31:12
【问题描述】:
下面的构造可以正常工作并且可以执行我想要的操作,但我想了解它为什么不会死锁。
下面的示例确保用户在继续之前点击了(在 EDT 上)弹出的 JOptionPane 框上的是或否。
package waitexample;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
public class WaitExample {
public static void main(String[] args) throws InterruptedException {
System.out.println("starting");
Object myWaiter = new Object();
SwingUtilities.invokeLater(() -> {
System.out.println("invoked");
JOptionPane.showConfirmDialog(null, "Message", "Title", JOptionPane.YES_NO_OPTION);
synchronized (myWaiter) {
System.out.println("calling notify");
myWaiter.notify();
System.out.println("notified");
}
});
synchronized (myWaiter) {
System.out.println("waiting");
myWaiter.wait();
System.out.println("done waiting");
}
System.out.println("ending main()");
}
}
但看起来我正在使用不同的线程同时进入 synchronized(myWaiter) 块,给出以下输出:
starting
waiting
invoked
calling notify
notified
done waiting
ending main()
为什么不会出现这种死锁?
【问题讨论】:
-
等待锁释放该锁并在唤醒时重新获取它。
标签: java multithreading deadlock synchronized