我正在读一本来自 CodeRanch 的线程 http://www.coderanch.com/t/455033/java-programmer-SCJP/certification/abstract-synchronized-methods-not-allowed说抽象方法无法同步,因为抽象类无法实例化,这意味着没有对象可以锁定。
这是没有意义的,因为抽象类是子类的定义(契约)。同步方法的抽象定义不需要锁定,子方法需要锁定。所有抽象标题都表明孩子must同步此方法。我的逻辑正确吗?如果没有,有人可以解释为什么我错了吗?
关于无法实例化抽象类的评论是垃圾。鉴于它必须是一个实例方法才能抽象,所以肯定有is可以锁定的参考。抽象类中的具体方法还是可以参考this
。然而,这仍然并不意味着抽象类应该能够同步。
方法是否同步是一个实施细节该方法的。未指定同步anywhere作为声明性契约 - 它也不像您可以在接口中同步。
类如何实现它提供的任何线程安全保证取决于它。如果一个抽象类想要mandate一种特定的方法,应该使用模板方法模式:
// I hate synchronizing on "this"
private final Object lock = new Object();
public final void foo() {
synchronized(lock) {
fooImpl();
}
}
protected abstract void fooImpl();
但这本身是相当危险的,因为它实际上是在锁内调用“未知”代码,这会导致死锁等。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)