По какой причине «синхронизированный» не разрешен в интерфейсных методах Java 8?
В 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
по интерфейсным методам?