[英]Overriding synchronized methods in Java
假設我在某個類上有一個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關鍵字)? 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() {
// ...
}
和往常一樣,你可能會更好地使用委托而不是子類化。
覆蓋同步方法時未能使用synchronized可能會導致運行時錯誤。 作為安全措施,您可以打開Eclipse檢查程序來檢測此情況。 默認為“忽略”。 “警告”也是一個有效的選擇。
這會產生這樣的信息:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.