У 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що вимагає повної повторної реалізації та можливого доступу до приватних членів. До речі, є причина, що ці методи називаються "захисниками" - вони існують, щоб додати нові методи.