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