Хотя поначалу может показаться очевидным, что хотелось бы поддерживать модификатор synchronized
в методах по умолчанию, оказалось, что это было бы опасно, и поэтому было запрещено.
Синхронизированные методы — это сокращение для метода, который ведет себя так, как будто все тело заключено в блок synchronized
, объектом блокировки которого является получатель. Может показаться разумным распространить эту семантику и на методы по умолчанию; в конце концов, они также являются методами экземпляра с получателем. (Обратите внимание, что методы synchronized
— это полностью синтаксическая оптимизация; они не нужны, они просто более компактны, чем соответствующий блок synchronized
. Можно привести разумный аргумент, что это была прежде всего преждевременная синтаксическая оптимизация, и что синхронизированные методы создают больше проблем, чем решают, но этот корабль уже давно уплыл.)
Так чем же они опасны? Синхронизация связана с блокировкой. Блокировка — это координация общего доступа к изменяемому состоянию. Каждый объект должен иметь политику синхронизации, которая определяет, какие блокировки защищают какие переменные состояния. (См. Параллелизм Java на практике, раздел 2.4.)
Многие объекты используют в качестве своей политики синхронизации Шаблон монитора Java (JCiP 4.1), в котором состояние объекта охраняется его внутренней блокировкой. В этом шаблоне нет ничего волшебного или особенного, но он удобен, и использование ключевого слова synchronized
в методах неявно предполагает этот шаблон.
Именно класс, которому принадлежит состояние, определяет политику синхронизации этого объекта. Но интерфейсы не владеют состоянием объектов, с которыми они смешаны. Таким образом, использование синхронизированного метода в интерфейсе предполагает определенную политику синхронизации, но такую, для принятия которой у вас нет разумных оснований, так что вполне может быть так, что использование синхронизации не обеспечивает никакой дополнительной безопасности потоков (возможно, вы синхронизируете не ту блокировку). Это дало бы вам ложное чувство уверенности в том, что вы сделали что-то для безопасности потоков, и никакое сообщение об ошибке не говорит вам о том, что вы принимаете неправильную политику синхронизации.
Уже достаточно сложно последовательно поддерживать политику синхронизации для одного исходного файла; еще труднее обеспечить правильное соблюдение подклассом политики синхронизации, определенной его суперклассом. Попытка сделать это между такими слабо связанными классами (интерфейс и, возможно, множество классов, которые его реализуют) была бы почти невозможной и очень подверженной ошибкам.
Учитывая все эти аргументы против, что будет аргументом за? Кажется, они в основном предназначены для того, чтобы интерфейсы вели себя как трейты. Хотя это понятное желание, центр разработки методов по умолчанию — это эволюция интерфейса, а не «Черты--». Там, где можно было добиться последовательного достижения этих двух целей, мы стремились к этому, но там, где одно противоречило другому, нам приходилось выбирать в пользу основной цели дизайна.
person
Brian Goetz
schedule
05.05.2014
default synchronized
, но не обязательно дляstatic synchronized
, хотя я согласен, что последнее могло быть опущено из соображений согласованности. - person Lukas Eder   schedule 04.05.2014synchronized
может быть переопределен в подклассах, поэтому это имело бы значение только в том случае, если бы было что-то в качестве окончательных методов по умолчанию. (Ваш другой вопрос) - person skiwi   schedule 04.05.2014synchronized
в суперклассах, эффективно удаляя синхронизацию. Я не удивлюсь, что отсутствие поддержкиsynchronized
и отсутствие поддержкиfinal
связано, возможно, из-за множественного наследования (например, наследованиеvoid x()
иsynchronized void x()
и т. д.). Но это предположение. Меня интересует авторитетная причина, если она есть. - person Lukas Eder   schedule 04.05.2014super
, что требует полной повторной реализации и возможного доступа к закрытым членам. Кстати, есть причина, по которой эти методы называются защитниками — они присутствуют, чтобы упростить добавление новых методов. - person bestsss   schedule 10.05.2014