Есть ли один сценарий (кроме совместимости с древними JVM), где использование synchronized
предпочтительнее, чем использование Lock
? Кто-нибудь может оправдать использование wait
или notify
более новые системы?
Есть ли алгоритм, который должен использовать один из них в своей реализации?
Я вижу предыдущие вопросы, которые касались этого вопроса, но я хотел бы пойти немного дальше и на самом деле deprecate
их. Слишком много ловушек, ловушек и предостережений с ними, которые были сглажены новыми средствами. Я просто чувствую, что скоро может быть время отметить их устаревшими.
java
synchronization
deprecation
OldCurmudgeon
источник
источник
Ответы:
Почти наверняка нет. (Действительно, с теоретической точки зрения, вы должны иметь возможность имитировать ожидание / уведомление, используя другие классы 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
имеет огромные последствия.источник
java.util.concurrent
классы util на самом деле быстрее. За кулисами эти классы напрямую общаются с ВМ, где при синхронизации устанавливает тупую блокировку объекта в графе объектов и, таким образом, влияет на глобальную производительность.synchronized
et. и др. Я просто предлагаю устаревший, который на самом деле только говорит, что не используйте это для нового кода. Я бы не мечтал о том, чтобы предложить испортить испытанный и унаследованный код, требуя их удаления.