Qual é a razão pela qual “sincronizado” não é permitido nos métodos de interface Java 8?
No Java 8, eu posso escrever facilmente:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Receberei a semântica de sincronização completa que também posso usar nas aulas. No entanto, não posso usar osynchronized
modificador nas declarações do método:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Agora, pode-se argumentar que as duas interfaces se comportam da mesma maneira, exceto queInterface2
estabelece umcontrato emmethod1()
e emmethod2()
, que é um pouco mais forte do queInterface1
faz. Claro, também podemos argumentar quedefault
as implementações não devem fazer suposições sobre o estado concreto da implementação, ou que essa palavra-chave simplesmente não exerça seu peso.
Qual é a razão pela qual o grupo de especialistas JSR-335 decidiu não apoiarsynchronized
em métodos de interface?