В 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
методы интерфейса?