Есть ли алгоритм, который должен использовать один из них в своей реализации?
Почти наверняка нет. (Действительно, с теоретической точки зрения, вы должны иметь возможность имитировать ожидание / уведомление, используя другие классы java.util.concurrent ... И синхронизированные могут быть заменены явными операциями блокировки ... хотя вам нужно быть осторожным, чтобы разблокировать в finally
статьи.)
Однако, вероятно , существуют алгоритмы, в которых наиболее эффективная реализация в Java предполагает прямое использование синхронизированных с ожиданием и уведомлением или без него.
Пришло время отказаться от синхронизации, ждать и уведомлять?
Независимо от ответа на предыдущий вопрос, ответ определенно нет.
Ожидание / уведомление могут быть (и часто используются) правильно. В Java устаревание зарезервировано для классов и методов, которые не работают; то есть, где дальнейшее использование должно быть исправлено в срочном порядке. Если бы Sun (а теперь и Oracle) отказались от чего-то столь же фундаментального и столь же широко используемого как ожидание / уведомление, это создало бы серьезную проблему совместимости для огромного количества унаследованного кода. Это НЕ в чьих-либо интересах.
Если вы хотите избавиться от синхронизации / ожидания / уведомления в вашем коде, это нормально. Но устаревание требует переписывания большого количества по существу правильного многопоточного кода, и это будет ПЛОХАЯ ИДЕЯ. Корпоративные ИТ-менеджеры и менеджеры по программным продуктам не хотели бы, чтобы вы предлагали это ...
Стоит прочитать, что означает «устарел» в соответствии с документацией Java: http://docs.oracle.com/javase/1.5.0/docs/guide/javadoc/deprecation/deprecation.html.
Также обратите внимание, что мы говорим об устаревших вещах, которые являются ядром языка Java. Обесценивание synchronized
имеет огромные последствия.