例如,這是我在 Spring Boot 代碼中看到的(在帶有變數的catch塊中):webServer
@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?
uj5u.com熱心網友回復:
分配的主要目的是避免在空檢查之后和呼叫之前由并發執行緒設定NullPointerException為時產生 a。this.webServernullwebServer.stop()
也就是說,沒有區域變數:
- 你的執行緒:
this.webServer != null-> true - 另一個執行緒:
this.webServer = null - 您的執行緒:
this.webServer.stop()-> 可能導致NullPointerException(取決于步驟 2 中更改的可見性,這可能并不總是發生;競爭條件)。
在其他形式的代碼中,與重復參考欄位相比,將欄位分配給區域變數也可以帶來性能優勢。
uj5u.com熱心網友回復:
如果對實體變數進行空值檢查,則另一個執行緒可能會this.webServer在檢查空值之后但在webServer.stop();呼叫之前取消。這個答案很好地描述了這種行為。
uj5u.com熱心網友回復:
如果您在多執行緒環境中作業,則同一變數可能對執行緒具有不同的值。在這種情況下,如果代碼 env 未同步,您將獲得 NPE。
如果要使用this.webServer.stop(),請確保您對該變數的讀寫在每個位置同步,否則按照建議使用區域變數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/496638.html
