覆盖Java中的同步方法

时间:2013-03-12 23:53:24

标签: java override synchronized

假设我在某个类上有一个synchronized方法:

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关键字)?

2 个答案:

答案 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检查程序来检测此情况。 默认为“忽略”。 “警告”也是一个有效的选择。 preferences

将产生此消息:

enter image description here

enter image description here