簡體   English   中英

覆蓋Java中的同步方法

[英]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();
        // ...
    }
 }

關於這種情況,我有幾個具體的問題:

  1. 被覆蓋的方法也會被隱式同步嗎?
  2. 如果沒有, super調用會同步嗎?
  3. 如果沒有super呼叫,是否會同步?
  4. 有沒有辦法強制重寫方法使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM