为什么静态和默认接口方法不能同步?
人们说synchronized是一个实现细节。那么,strictfp也是一个实现细节,但这并不妨碍在静态和默认接口方法上允许strictfp。
继承默认方法,如果实现接口的类没有覆盖默认方法,则可能非常方便它已经同步。
我猜测synchronized(以及strictfp)不是继承的(我在这里吗?),但这并不能解释为什么staticfp也允许用于静态和默认接口方法。
答案 0 :(得分:6)
strictfp
关键字可确保您的浮点操作are consistent across all platforms。 stricftp
然后成为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
个对象同步。