En Java 8, puedo escribir fácilmente:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Obtendré la semántica de sincronización completa que puedo usar también en las clases. Sin embargo, no puedo usar el synchronizedmodificador en las declaraciones de método:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Ahora, se puede argumentar que las dos interfaces se comportan de la misma manera excepto que Interface2establece un contrato en method1()y en method2(), que es un poco más fuerte que lo Interface1hace. Por supuesto, también podríamos argumentar que las defaultimplementaciones no deberían hacer suposiciones sobre el estado de implementación concreto, o que dicha palabra clave simplemente no aumentaría su peso.
Pregunta:
¿Cuál es la razón por la cual el grupo de expertos JSR-335 decidió no admitir los synchronizedmétodos de interfaz?
default synchronized, pero no necesariamente static synchronized, aunque aceptaría que esta última podría haberse omitido por razones de coherencia.
synchronizedmodificador puede ser anulado en las subclases, por lo tanto, solo importaría si hubiera algo como métodos predeterminados finales. (Su otra pregunta)
synchronizeden superclases, eliminando efectivamente la sincronización. Sin embargo, no me sorprendería que no admitir synchronizedy no admitir finalesté relacionado, tal vez debido a la herencia múltiple (por ejemplo, herencia void x() y synchronized void x() , etc.). Pero eso es especulación. Tengo curiosidad acerca de una razón autorizada, si hay una.
superque requiere una reimplementación completa y un posible acceso a miembros privados. Por cierto, hay una razón por la cual esos métodos se llaman "defensores": están presentes para permitir la adición de nuevos métodos más fácilmente.