线程永远等待通知案例

时间:2013-09-26 13:13:44

标签: java multithreading happens-before

在任何情况下都可以在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();
        }  
     }
}

2 个答案:

答案 0 :(得分:2)

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

如果您需要确定性行为,只有在您开始等待通知后才应致电b.start()

答案 1 :(得分:0)

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

你几乎不可能认为某件事会在另一件事之前发生。

有关创建之前发生关系的操作列表,请参阅:Java Memory VisibilityThe Java™ Language Specification的第17章