我有以下代码,我预计它会在打印出“Main: pre-sync”后死锁。但看起来 synchronized
并没有达到我的预期。这里发生了什么?
import java.util.*;
public class deadtest {
public static class waiter implements Runnable {
Object obj;
public waiter(Object obj) {
this.obj = obj;
}
public void run() {
System.err.println("Thead: pre-sync");
synchronized(obj) {
System.err.println("Thead: pre-wait");
try {
obj.wait();
} catch (Exception e) {
}
System.err.println("Thead: post-wait");
}
System.err.println("Thead: post-sync");
}
}
public static void main(String args[]) {
Object obj = new Object();
System.err.println("Main: pre-spawn");
Thread waiterThread = new Thread(new waiter(obj));
waiterThread.start();
try {
Thread.sleep(1000);
} catch (Exception e) {
}
System.err.println("Main: pre-sync");
synchronized(obj) {
System.err.println("Main: pre-notify");
obj.notify();
System.err.println("Main: post-notify");
}
System.err.println("Main: post-sync");
try {
waiterThread.join();
} catch (Exception e) {
}
}
}
由于两个线程在创建的对象上同步,我希望线程实际上会相互阻塞。目前,代码愉快地通知其他线程、加入和退出。
最佳答案
在监视器上调用 .wait()
实际上会释放同步锁,这样其他线程就可以锁定到同一个监视器并发送通知。
您的行为完全正常:“服务员”锁定监视器,然后在等待通知时释放锁定。 1 秒后,主线程锁定监视器,发送通知,解锁监视器,唤醒等待者以完成其操作。
关于Java synchronized 似乎被忽略了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2499867/