在Java中重写同步方法

比方说,我有一个类的同步方法:

abstract class Foo { public synchronized void foo() { // synchronized! // ... }; } 

没有使用synchronized修饰符覆盖它:

 class Bar extends Foo { @Override public void foo() { // NOT synchronized! super.foo(); // ... } } 

我有几个关于这个场景的具体问题:

  1. 重写的方法是否会被隐式地同步?
  2. 如果没有, super调用是否会同步?
  3. 如果没有super调用,什么都可以同步?
  4. 有没有办法强制重写方法使用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。 优先

这会产生这样的信息:

在这里输入图像说明

在这里输入图像说明