Поток ожидает навсегда для случая уведомления

Возможно ли в каких-то случаях получить "ожидание навсегда" в 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 ответа

Да, это возможно. Как только вы позвоните b.start() Планировщик может выбрать запуск потока B, и он немедленно получит блокировку и вызовет уведомление, когда поток A не ожидает блокировки. В этой ситуации угроза А позже получит блокировку и будет ждать вечно.

Если вам нужно детерминированное поведение, вы должны позвонить b.start() только после того, как вы начали ждать уведомления.

Нет гарантии порядка исполнения ваших тем. Возможно (и, насколько я помню, как потоки работают в Java), что уведомление будет происходить до вызова wait().

Вы почти никогда не можете предположить, что что-то случится раньше, чем другое.

Список действий, которые создают отношения "происходит раньше", см. В разделе " Видимость памяти Java" или "Глава 17 спецификации языка Java™".

Другие вопросы по тегам