Java同步似乎被忽略了
我有以下代码,我希望在打印出“Main:pre-sync”后会死锁。但是它看起来像是Java同步似乎被忽略了,java,multithreading,synchronization,deadlock,Java,Multithreading,Synchronization,Deadlock,我有以下代码,我希望在打印出“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;
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()
操作时,该线程会释放该对象上的锁,以允许其他线程获得该锁,并notify()
等待的线程。看
当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行
在监视器上调用.wait()
实际上会释放同步锁,以便其他线程可以锁定到同一监视器并发送通知
您的行为完全正常:“服务员”锁定监视器,然后在等待通知时释放锁。1秒后,主线程锁定监视器,发送通知,解锁监视器,从而唤醒服务员完成其操作