为什么静态和默认接口方法不能同步但可以是strictfp?

时间:2017-12-13 17:42:24

标签: java interface

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

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

继承默认方法,如果实现接口的类没有覆盖默认方法,则可能非常方便它已经同步。

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

3 个答案:

答案 0 :(得分:6)

strictfp关键字可确保您的浮点操作are consistent across all platformsstricftp然后成为JVM 的保证,您的浮点运算在所有平台上都是相同的,并且可以预期浮点运算是可移植的并且始终如一

标记为synchronized的方法实际上是实现详细信息,并且不能由任何一个接口为其任何实现指定或控制。如Brian Goetz所解释的那样故意从默认方法中排除,因为它们本质上是危险的(强调我的):

  

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

     

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

答案 1 :(得分:3)

我认为这是因为如果允许的话:

interface I {
    static synchronized void x() {
    }
}

class C implements I {
    synchronized static void y() {
    }
}

然后两个不同的线程可以输入C.y()和C.x(),因为x()在I.class上同步,而y()在C.class上同步。这只是我的猜测

答案 2 :(得分:0)

class C {
    public synchronized void f () {
    }
}

相同
class C {
    public void f () {
        synchronized(this){
        }
    }
}

如果f是静态的,则不会有this个对象同步。