Какое событие заставит ожидающий поток выполнить синхронизированный метод, уже запущенный другим потоком? - PullRequest
0 голосов
/ 29 января 2019

В Java-программировании, если у меня заблокирован поток A, когда он пытается выполнить метод synchronized того же объекта, который выполняет другой поток B, какое событие позволит потоку A выполнить синхронизированный метод?

Является ли тот простой факт, что поток B завершил выполнение метода, достаточно, чтобы поток A вышел из своего состояния ожидания и выполнил метод?Или мне нужно вызвать notifyAll или notify где-нибудь в синхронизированном методе?

1 Ответ

0 голосов
/ 29 января 2019

Java Tutorial говорит:

Когда один поток выполняет метод synchronized для объекта, все остальные потоки, которые вызывают методы synchronized для того же блока объекта (приостанавливают выполнение) до тех пор, покапервый поток выполняется с объектом.

Справочник по языку Java говорит (подчеркните мой):

8.4.3.6.synchronized Методы

Метод synchronized получает монитор (§17.1) до его выполнения.

Для метода класса (статического) - монитор, связанный с объектом Classдля класса метода используется.

Для метода экземпляра используется связанный с ним монитор (объект, для которого был вызван метод).

17.1.Синхронизация

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

Оператор synchronized (§14.19) вычисляет ссылку на объект;затем он пытается выполнить действие блокировки на мониторе этого объекта и не продолжается, пока действие блокировки не будет успешно завершено.После выполнения действия блокировки выполняется тело оператора synchronized. Если выполнение тела когда-либо завершено, как обычно, так и внезапно, на этом же мониторе автоматически выполняется действие по разблокировке .

14.19.Синхронизированный оператор

Оператор synchronized получает блокировку взаимного исключения (§17.1) от имени исполняющего потока, выполняет блок, а затем снимает блокировку .Пока исполняющий поток владеет блокировкой, никакой другой поток не может получить блокировку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...