Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java同步似乎被忽略了_Java_Multithreading_Synchronization_Deadlock - Fatal编程技术网

Java同步似乎被忽略了

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;

我有以下代码,我希望在打印出“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()
操作时,该线程会释放该对象上的锁,以允许其他线程获得该锁,并
notify()
等待的线程。看

当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到另一个线程通过调用notify方法或notifyAll方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并恢复执行

在监视器上调用
.wait()
实际上会释放同步锁,以便其他线程可以锁定到同一监视器并发送通知

您的行为完全正常:“服务员”锁定监视器,然后在等待通知时释放锁。1秒后,主线程锁定监视器,发送通知,解锁监视器,从而唤醒服务员完成其操作