Java synchronized 似乎被忽略了

标签 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;
      }

      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/

相关文章:

c# - 在特定线程上调用委托(delegate) C#

java - 如何让加载 Activity 等待线程完成

php - 如何实时同步两个不同mysql数据库的两个表?

javascript - javascript for 循环内的异步过程

c# - 是否可以将没有结构和有限泛型的 C# 编译到 JVM 中?

java - 如何在android中为注册表单输入日期字段?

c# - 定期运行的 Windows 服务

java - JSF 验证消息

java - 使用处理搜索类和对象的示例

mysql - postgres和mysql数据库服务器同步?