为什么静态和默认接口方法不能同步?
人们说synchronized是一个实现细节.那么,strictfp也是一个实现细节,但这并不妨碍在静态和默认接口方法上允许strictfp.
如果实现接口的类没有覆盖默认方法,则继承默认方法并使其已经同步可能非常方便.
我猜测synchronized(以及strictfp)不是继承的(我在这里吗?),但这并不能解释为什么strictfp也允许静态和默认接口方法.
该strictfp关键字可确保您的浮点运算在所有平台上保持一致. stricftp然后成为JVM的保证,你的浮点运算在所有平台上将是相同的,并且可以预期浮点运算在整个过程中是可移植的和一致的.
标记的方法synchronized实际上是一个实现细节,并且不能由任何一个接口为其任何实现指定或控制.正如布莱恩·戈茨(Brian Goetz)所解释的那样,它被故意排除在默认方法之外,因为它们具有天生的危险性(强调我的):
......那么,他们为什么危险?同步是关于锁定.锁定是关于协调对可变状态的共享访问.每个对象都应该有一个同步策略,用于确定哪些锁保护哪些状态变量.(参见实践中的Java Concurrency,第2.4节.)
... 拥有该状态的类可以确定该对象的同步策略.但是接口不拥有混合它们的对象的状态.因此,在接口中使用synchronized方法会假定一个特定的同步策略,但是您没有合理的假设基础,因此很可能使用同步不会提供额外的线程安全性(您可能正在同步错误的锁定).
| 归档时间: |
|
| 查看次数: |
281 次 |
| 最近记录: |