In Java 8 kann ich leicht schreiben:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
Ich werde die vollständige Synchronisationssemantik erhalten, die ich auch in Klassen verwenden kann. Ich kann den synchronizedModifikator jedoch nicht für Methodendeklarationen verwenden:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Nun kann man argumentieren , dass die beiden Schnittstellen verhalten sich die gleiche Weise , außer dass Interface2ein legt Vertrag auf method1()und auf method2(), die ein wenig stärker als das , was der Interface1Fall ist. Natürlich könnten wir auch argumentieren, dass defaultImplementierungen keine Annahmen über den konkreten Implementierungsstatus treffen sollten oder dass ein solches Schlüsselwort einfach nicht an Bedeutung gewinnen würde.
Frage:
Was ist der Grund, warum die JSR-335-Expertengruppe beschlossen hat, synchronizedSchnittstellenmethoden nicht zu unterstützen ?
default synchronized, aber nicht unbedingt für static synchronized, obwohl ich akzeptieren würde, dass letzteres aus Konsistenzgründen weggelassen worden sein könnte.
synchronizedModifikator in Unterklassen möglicherweise überschrieben wird. Daher wäre es nur wichtig, wenn es etwas als endgültige Standardmethode gäbe. (Ihre andere Frage)
synchronizedin Superklassen deklariert sind, wodurch die Synchronisation effektiv entfernt wird. Es würde mich nicht wundern , wenn nicht unterstützt synchronizedund nicht unterstützt finalwird, möglicherweise aufgrund von Mehrfachvererbung (z. B. Vererbung void x() und synchronized void x() usw.). Aber das ist Spekulation. Ich bin neugierig auf einen maßgeblichen Grund, falls es einen gibt.
superwas eine vollständige Neuimplementierung und einen möglichen Zugriff auf private Mitglieder erfordert. Übrigens gibt es einen Grund, warum diese Methoden als "Verteidiger" bezeichnet werden - sie sind vorhanden, um das Hinzufügen neuer Methoden zu erleichtern.