[英]why variable defined in a class is not a local variable but instance variable in java?
[英]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
。
也就是說,沒有局部變量:
this.webServer != null
-> truethis.webServer = null
this.webServer.stop()
-> 可能導致NullPointerException
(取決於步驟 2 中更改的可見性,這可能並不總是發生;競爭條件)。在其他形式的代碼中,與重復引用字段相比,將字段分配給局部變量也可以帶來性能優勢。
如果對實例變量進行空值檢查,則另一個線程可能會在this.webServer
檢查空值之后但在webServer.stop();
叫做。 這個答案很好地描述了這種行為。
如果您在多線程環境中工作,則同一變量可能對線程具有不同的值。 在這種情況下,如果代碼 env 未同步,您將獲得 NPE。
如果您想使用this.webServer.stop()
,請確保您對該變量的讀寫在每個位置同步,否則按照建議使用局部變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.