Блокировка снята после вызова метода wait ()? - PullRequest
0 голосов
/ 11 мая 2018

Я читал об ожидании и уведомлении на Java.

Поясню на небольшом примере:

@Override
    public void run() {
        synchronized (msg) {
            try{
                msg.wait();
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(name+" processed: "+msg.getMsg());
        }
    }

Здесь говорится, что когда мы делаем synchronized (msg). Текущий поток T1 будет блокировать объект msg.

Таким образом, блокировку можно снять двумя способами:

  1. После завершения синхронизированного блока
  2. когда wait () вызывается T1 ??

И если какой-то другой поток вызовет notify () и разбудит поток T1, T1 снова получит доступ для блокировки на msg объекте?

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Lock освобождается после вызова wait().

И если какой-то другой поток вызывает notify () и пробуждает поток T1, T1 снова получит доступ к блокировке объекта msg?

Не получит доступ к автоматической блокировке.Он должен конкурировать с другими потоками.

Вкл. notify () (из javadocs):

Просыпается один поток, ожидающий на мониторе этого объекта.Если какие-либо потоки ожидают этого объекта, один из них выбирается для пробуждения.Поток ожидает на мониторе объекта, вызывая один из методов ожидания.

Пробужденный поток не сможет продолжить работу, пока текущий поток не снимет блокировку этого объекта.Пробужденный поток будет конкурировать обычным образом с любыми другими потоками, которые могут активно конкурировать за синхронизацию на этом объекте;например, пробужденный поток не имеет надежных привилегий или недостатков в качестве следующего потока для блокировки этого объекта.

0 голосов
/ 11 мая 2018

Да, T1 снимет блокировку, когда wait, и он должен повторно зарегистрировать блокировку после получения уведомления. Подробности см. В спецификации языка Java .

И, метод wait должен вызываться в цикле while.

 synchronized (obj) {
     while (<condition does not hold>)
         obj.wait();
     ... // Perform action appropriate to condition
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...