当前位置: 首页 > 知识库问答 >
问题:

Java 8接口方法中不允许使用“synchronized”的原因是什么?

王才英
2023-03-14
interface Interface1 {
    default void method1() {
        synchronized (this) {
            // Something
        }
    }

    static void method2() {
        synchronized (Interface1.class) {
            // Something
        }
    }
}
interface Interface2 {
    default synchronized void method1() {
        //  ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
    }

    static synchronized void method2() {
        // ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here
    }
}

共有1个答案

闽阳州
2023-03-14

虽然一开始似乎很明显希望在默认方法上支持synchronized修饰符,但事实证明这样做是危险的,因此被禁止。

Synchronized methods是一种方法的简写,这种方法的行为就好像整个主体都包含在一个锁对象为接收器的Synchronized块中。将这种语义扩展到默认方法似乎是明智的;毕竟,它们也是带有接收器的实例方法。(请注意,synchronized方法完全是一种语法优化;它们不是必需的,只是比相应的synchronized块更紧凑。有一个合理的论点是,这首先是一种过早的语法优化,同步方法引起的问题比它们解决的问题多,但这条船在很久以前就开过了。)

那么,他们为什么危险呢?同步与锁定有关。锁定是关于协调对可变状态的共享访问。每个对象都应该有一个同步策略来确定哪些锁保护哪些状态变量。(请参阅Java并发实践,第2.4节。)

 类似资料:
  • 问题内容: 在Java 8中,我可以轻松地编写: 我将获得在类中也可以使用的完整同步语义。但是,我不能在方法声明上使用修饰符: 现在,可以争论说这两个接口的行为方式相同,只是在on 和on上建立了一个 契约 ,这比 契约 要强一点。当然,我们也可能会争辩说,实现不应对具体的实现状态做出任何假设,或者这样的关键字根本无法发挥作用。 题: JSR-335专家组决定不支持接口方法的原因是什么? 问题答案

  • 问题内容: Java 8最有用的功能之一是接口上的新方法。引入它们的原因基本上有两个(可能还有其他原因): 提供实际的默认实现。例: 允许JDK API演进。例: 从API设计人员的角度来看,我希望能够在接口方法上使用其他修饰符,例如。在添加便捷方法时,这将很有用,以防止在实现类时“意外”覆盖: 如果已经上过课,以上是已经很普遍的做法: 现在,并且显然是相互矛盾的关键字,但是默认关键字本身并没有严

  • 虽然有些人曾经问过这个问题,但那是在Java8发布之前。 以前,静态成员是不允许的,因为实现细节不能在接口中定义。这也是为什么任何东西都不应该是私有的,因为接口的实现者需要提供实现细节。 Java8改变了这种情况,不是吗?默认方法定义实现细节,静态方法也是如此。那么,为什么仍然不允许这样做呢?

  • 问题内容: 但是那里给出的解决方案不起作用。他们说我需要采取以下行动: 在项目结构中| 在“项目”对话框中,在界面中将“项目语言级别”更改为6.0-@Override。 但是,目前项目语言级别是6.0,但是我仍然看到错误。 维克(Vic),这是一个窗口,并且在语言级(Language level)下没有JVM版本(不幸的是,由于我有10个信誉,所以我无法发布图像) 问题答案: 如果您的项目有多个模

  • 我们举个例子: 一个常见的解决方案是转移到一个抽象类,但是在我的具体案例中,我有一个枚举的接口,所以在这里不适用。我想这不是被忽略了,就是因为接口背后的原始想法,即它们是可用方法的“契约”,但我想我需要关于这是怎么回事的输入。 我读过“为什么Java 8接口方法中不允许使用”final“?”,其中说: 默认方法的基本思想是:它是具有默认实现的接口方法,派生类可以提供更具体的实现 与关联问题一样,由

  • 问题内容: 为什么在Java 8中允许接口具有方法? 如下面的代码所述,它可以正常工作并正确产生输出。 目前它的行为就像一个类,我已经用main方法执行了。 我们为什么需要这个? 问题答案: 从Java 8开始,接口中允许使用静态方法。 main()是静态方法。 因此,在接口中允许main()。 我们 不需要 它,因为以前不允许这样做,但是我们幸存了下来。但是,根据定义,由于静态方法不是绑定到类的