假设我在某个类上有一个synchronized方法:
abstract class Foo {
public synchronized void foo() { // synchronized!
// ...
};
}
我使用synchronized修饰符覆盖了没有:
class Bar extends Foo {
@Override
public void foo() { // NOT synchronized!
super.foo();
// ...
}
}
关于这种情况,我有几个具体的问题:
super
- 呼叫会同步吗?super
- 来电,是否会同步?synchronized
(我注意到接口内的抽象方法定义或方法定义不允许使用synchronized关键字)?答案 0 :(得分:46)
public synchronized void foo() { // synchronized!
// ...
};
基本上与:
相同public void foo() {
synchronized (this) { // synchronized!
// ...
}
};
后者更明确,所以我通常建议使用该表格。或者更好地使用私有字段而不是“外部”对象的锁。
所以:1。不.2。是的。 3.否。标记方法final
并调用可能被覆盖的protected
方法。
public final void foo() {
synchronized (this) {
fooImpl();
}
};
protected void fooImpl() {
// ...
}
与往常一样,你可能会更好地使用委托而不是子类化。
答案 1 :(得分:22)
在覆盖同步方法时未能使用synchronized可能会导致运行时错误。作为安全措施,您可以打开Eclipse检查程序来检测此情况。 默认为“忽略”。 “警告”也是一个有效的选择。
将产生此消息: