在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
}
}
现在,可以争论说这两个接口的行为方式相同,只是在on 和on上Interface2
建立了一个契约,这比契约要强一点。当然,我们也可能会争辩说,实现不应对具体的实现状态做出任何假设,或者这样的关键字根本无法发挥作用。method1()
method2()
Interface1
default
题:
JSR-335专家组决定不支持synchronized
接口方法的原因是什么?
default synchronized
,但不一定是这样static synchronized
,尽管我会接受出于一致性的原因而省略了后者。
synchronized
修饰符可能会在子类中被覆盖,因此,只有在最终默认方法中存在某些问题时,才有意义。(您的另一个问题)
synchronized
在超类中声明的方法,从而有效地消除同步。我不惊讶不支持synchronized
与不支持final
相关,但是,可能是因为多重继承(例如,继承void x()
和 synchronized void x()
等)。但这只是猜测。如果有一个合理的理由,我很好奇。
super
,这需要完全重新实现并可能访问私有成员。顺便说一句,将这些方法称为“防御者”是有原因的-存在它们是为了使添加新方法更加容易。