В Java 8 я могу легко написать:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Я получу полную семантику синхронизации, которую я могу использовать и в классах. Однако я не могу использовать synchronized
модификатор в объявлениях методов:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Теперь можно утверждать , что два интерфейса ведут себя таким же образом , за исключением того, что Interface2
устанавливает контракт на method1()
и на method2()
, что немного сильнее , чем Interface1
делает. Конечно, мы могли бы также утверждать, что default
реализации не должны делать никаких предположений о конкретном состоянии реализации, или что такое ключевое слово просто не будет тянуть свой вес.
Вопрос:
По какой причине экспертная группа JSR-335 решила не поддерживать synchronized
методы интерфейса?
default synchronized
, но не обязательно для него static synchronized
, хотя я бы согласился, что последнее могло быть опущено по соображениям согласованности.
synchronized
модификатор может быть переопределен в подклассах, следовательно, это будет иметь значение только в том случае, если есть что-то в качестве окончательных методов по умолчанию. (Ваш другой вопрос)
synchronized
в суперклассах, эффективно удаляя синхронизацию. Я не удивлюсь, что не поддержка synchronized
и не поддержка final
связаны, хотя, может быть, из-за множественного наследования (например, наследование void x()
и synchronized void x()
т. Д.). Но это предположение. Мне любопытно по поводу авторитетной причины, если она есть.
super
что требует полной повторной реализации и возможного доступа к закрытым членам. Кстати, есть причина, по которой эти методы называются «защитниками» - они присутствуют, чтобы облегчить добавление новых методов.