In Java 8, I can easily write:
interface Interface1 {
default void method1() {
synchronized (this) {
// Something
}
}
static void method2() {
synchronized (Interface1.class) {
// Something
}
}
}
I will get the full synchronisation semantics that I can use also in classes. I cannot, however, use the synchronized
modifier on method declarations:
interface Interface2 {
default synchronized void method1() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
static synchronized void method2() {
// ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
}
}
Now, one can argue that the two interfaces behave the same way except that Interface2
establishes a contract on method1()
and on method2()
, which is a bit stronger than what Interface1
does. Of course, we might also argue that default
implementations should not make any assumptions about concrete implementation state, or that such a keyword simply wouldn’t pull its weight.
Question:
What is the reason why the JSR-335 expert group decided not to support synchronized
on interface methods?