簡體   English   中英

為什么將實例變量分配給局部變量?

[英]Why assigning instance variable to local variable?

例如,這是我在 Spring Boot 代碼中看到的(在帶有webServer變量的catch塊中):

@Override
public final void refresh() throws BeansException, IllegalStateException {
    try {
        super.refresh();
    }

    catch (RuntimeException ex) {
        WebServer webServer = this.webServer;
        if (webServer != null) {
            webServer.stop();
        }
        throw ex;
    }
}

為什么不這樣做this.webServer.stop()

局部變量webServer的目的是什么?

分配的主要目的是避免在this.webServer在 null 檢查之后和webServer.stop()調用之前由並發線程設置為null時產生NullPointerException

也就是說,沒有局部變量:

  1. 你的線程: this.webServer != null -> true
  2. 另一個線程: this.webServer = null
  3. 您的線程: this.webServer.stop() -> 可能導致NullPointerException (取決於步驟 2 中更改的可見性,這可能並不總是發生;競爭條件)。

在其他形式的代碼中,與重復引用字段相比,將字段分配給局部變量也可以帶來性能優勢。

如果對實例變量進行空值檢查,則另一個線程可能會在this.webServer檢查空值之后但在webServer.stop(); 叫做。 這個答案很好地描述了這種行為。

如果您在多線程環境中工作,則同一變量可能對線程具有不同的值。 在這種情況下,如果代碼 env 未同步,您將獲得 NPE。

如果您想使用this.webServer.stop() ,請確保您對該變量的讀寫在每個位置同步,否則按照建議使用局部變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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