синхронизированный блок / метод без методов wait () и notify () notifyAll () - PullRequest
0 голосов
/ 14 сентября 2018

Недавно я наткнулся на код, в котором синхронизированное ключевое слово использовалось в объявлении метода, но в определении метода не было методов wait (), notify (), notifyAll ().

Мой вопрос здесь, насколько мне известно, синхронизированные блоки или методы используют методы wait (), notify (), notifyAll () для взаимодействия между потоками при обработке взаимодействия с несколькими потоками. Так что возможно иметь синхронизированный блок или метод без использования методов wait (), notify () или notifyAll ().

Спасибо

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Целью блока synchronized (или метода synchronized) является предотвращение взаимодействия потоков друг с другом, когда они получают доступ к общим данным.Цель wait(), notify() и notifyAll() - координировать действия двух или более потоков.

Но только потому, что двум или более потокам необходим доступ к одним и тем же общим данным, это невсегда означает, что они должны координировать свои действия друг с другом для достижения общей цели.Иногда достаточно, чтобы они просто не мешали друг другу.Это то, что делает synchronized - он удерживает потоки подальше друг от друга.

Кроме того, обратите внимание: только потому, что вы не видите явные вызовы ожидания / уведомления, это не означаетих там нетИногда потоки координируются с помощью объектов синхронизации более высокого уровня (например, BlockingQueue), которые могут использовать ожидание / уведомление (или нечто эквивалентное ожиданию / уведомлению ) в своей реализации.

0 голосов
/ 14 сентября 2018

Обязательно, чтобы wait(), notify() and notifyAll() всегда вызывался из синхронизированного блока.Но это не значит, что у синхронизированных блоков всегда должен быть один из этих методов.

...