1

是否有可能在任何情况下在 ThreadA 中获得“永远等待”的情况。我的意思是通知执行速度比b.sync.wait();

class ThreadA {
      public static void main(String [] args) {
         ThreadB b = new ThreadB();

         b.start();

         synchronized(b.sync) 
         {
            try 
            {
               System.out.println("Waiting for b to complete...");
               b.sync.wait();
               System.out.println("waiting done");
            } catch (InterruptedException e) {}         
         }
      }
}

class ThreadB extends Thread {   
     int total=0; 
     Integer sync = new Integer(1);
     public void run() {


        synchronized(sync) 
        {
           sync.notify();
        }  
     }
}
4

2 回答 2

2

对的,这是可能的。一旦你调用b.start()调度器可能会选择运行线程B,当线程A没有等待锁时,它会立即获得锁并调用通知。在这种情况下,威胁 A 稍后将获得锁定并继续等待。

如果您需要确定性行为,则应b.start()仅在开始等待通知后调用。

于 2013-09-26T13:17:37.717 回答
0

无法保证线程的执行顺序。通知可能会在调用 wait() 之前发生(而且,据我所知,线程在 Java 中是如何工作的) 。

你几乎不能假设某件事会先于另一件事发生。

有关创建先发生关系的操作列表,请参阅:Java 内存可见性或Java™ 语言规范的第 17 章

于 2013-09-26T13:20:51.823 回答