【问题标题】:Java synchronized seems ignoredJava 同步似乎被忽略了
【发布时间】:2010-03-23 12:38:42
【问题描述】:

我有以下代码,我预计在打印出“主要:预同步”后会死锁。但看起来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) {
      }
   }
}

由于两个线程在创建的对象上同步,我希望线程实际上会相互阻塞。目前,代码愉快地通知其他线程,加入和退出。

【问题讨论】:

    标签: java multithreading synchronization deadlock


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      当你wait() 一个对象时,线程释放对象上的锁以允许其他人获取锁,notify() 等待线程。请参阅javadoc for Object.wait()

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

      【讨论】:

        猜你喜欢
        • 2021-10-28
        • 2016-09-30
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 2017-12-05
        • 2012-03-08
        • 2015-12-11
        • 2014-04-15
        相关资源
        最近更新 更多