2016-01-30 11 views
0

Я понимаю, что эта тема обсуждалась во многих местах. Но все они говорят об использовании в многопоточной среде.Уведомление ограничено синхронизированной конструкцией

В следующем примере почему notify() должен быть окружен synchronized? Это напрасно, когда используется ключевое слово, которое оно должно делать. Но почему исключение, java.lang.IllegalMonitorStateException, когда оно не используется?

public class HelloWorld { 
    public static void main(String[] args) { 
     ABC c = new ABC(); 
     c.put(0); 
    } 
} 
class ABC { 
    public synchronized void put(int value) { // why synchronized now! 
     System.out.println("Put: " + value); 
     notify(); 
    } 
} 
+0

'notify()' не имеет цели в однопоточной среде. –

+0

http://stackoverflow.com/questions/2779484/why-must-wait-always-be-in-synchronized-block – FaNaJ

ответ

0

Вы должны использовать synchronized потому, что замок re-entrant, а это означает, что оно может быть приобретено несколько раз одним и тем же потоком. Другими словами, если ваш поток уже содержит блокировку объекта, ему не нужно ждать сам по себе.

 Смежные вопросы

  • Нет связанных вопросов^_^