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

为什么静态和默认接口方法不能同步,却可以strictfp?[副本]

庄智
2023-03-14

为什么静态和默认接口方法不能同步?

人们说synchronized是一个实现细节。嗯,strictfp也是一个实现细节,但这并不妨碍在静态和默认接口方法上允许strictfp。

默认方法是继承的,如果实现接口的类不重写默认方法,那么将其同步可能非常方便。

我猜测synchronized(以及strictfp)不是继承的(我在这里说的对吗?),但这并不能解释为什么strictfp被允许用于静态和默认接口方法。

共有1个答案

微生季
2023-03-14

strictfp关键字确保浮点操作在所有平台上都是一致的。stricftp然后成为JVM的一个保证,即浮点操作在所有平台上都是相同的,并且可以期望浮点操作在整个平台上都是可移植的和一致的。

标记为synchronized的方法实际上是一个实现细节,不能由任何一个接口为其任何实现指定或控制。正如Brian Goetz所解释的那样,它被有意地排除在默认方法之外,因为它们具有内在的危险性(强调的是我的):

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

...拥有状态的类决定对象的同步策略。但接口并不拥有它们所混合的对象的状态。因此,在接口中使用同步方法会假设一个特定的同步策略,但您没有合理的假设基础,因此使用同步很可能不会提供任何额外的线程安全(您可能在错误的锁上同步)。

 类似资料:
  • 我找不到任何解释原因的好消息:

  • 不允许在接口中使用静态/最终方法的原因到底是什么?

  • 学习Java8默认方法。这个链接就像互联网上的其他资源一样说 在“最严格的意义上”,默认方法是一种倒退,因为它们允许你用代码“污染”你的接口。但它们提供了允许向后兼容的最优雅和最实用的方法。它使Oracle更容易更新所有集合类,也使您更容易为Lambda修改现有代码。 我的理解是Java8Dev/Designers在接口中提供了默认方法,这样所有实现类就不必不必要地重写相同的行为,从而提供了向后兼

  • 当我注意到现在可以在接口中定义静态和默认方法时,我正在通过接口学习。 请解释两者的区别,如果有一个我们什么时候会使用它的例子,那就好了。界面上有点混乱。

  • 问题内容: 我不明白为什么主要方法必须是静态的。我了解静态变量,但静态方法很难掌握。是否存在静态方法,以便人们可以在两个不会相互冲突的类中创建两个具有相同名称的方法? 另外,我不明白为什么我不能创建静态构造函数。 谁能帮助解释这个概念? 问题答案: Java有 [静态构造函数] 静态初始化块,可以将其视为“静态构造函数”: 无论如何,主类中唯一 必须 是静态的方法是方法。这是因为调用它之前 没有

  • 问题内容: 该主题充分说明了这一点-为什么不能在接口中声明静态方法的原因是什么? 上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;仅允许public&abstract”。 问题答案: 这里有一些问题。第一个问题是声明静态方法而不定义它的问题。这是之间的区别 和 由于Espo提到的原因,第一个是不可能的:你不知道哪个实现类是正确的定义。 Java