在Java中重写同步方法
比方说,我有一个类的同步方法:
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关键字)?
public synchronized void foo() { // synchronized! // ... };
基本上是一样的:
public void foo() { synchronized (this) { // synchronized! // ... } };
后者更明确,所以我通常会build议使用这种forms。 或者更好地使用一个私有字段而不是“外部”对象的锁。
所以:1.不。2.是的。 3.第4步。标记方法final
并调用一个可能被覆盖的protected
方法。
public final void foo() { synchronized (this) { fooImpl(); } }; protected void fooImpl() { // ... }
与往常一样,你可能会更好地与代表团而不是inheritance。
重写同步方法时无法使用同步可能导致运行时错误。 作为一个安全措施,您可以打开一个Eclipse检查器来检测这种情况。 默认是“忽略”。 “警告”也是一个有效的select。
这会产生这样的信息: