創建已經保存爲成員字段的靜態易失性變量的本地引用的目的或價值是什麼。此代碼來自java.util.Scanner JDK 6b14 here。用於訪問易失性實例變量的局部變量
class Scanner {
private static volatile Pattern linePattern;
...
private static Pattern linePattern() {
Pattern lp = linePattern;
if (lp == null)
linePattern = lp = Pattern.compile("...");
return lp;
}
...
}
The Java Tutorials:「讀取和寫入原子的所有變量聲明爲volatile(包括長和雙變量)......到volatile變量任何寫入建立之前發生同一個變量的隨後關係讀取。 「
這意味着讀取Pattern對象的引用不會因爲它已經改變而中途失敗。 volatile關鍵字應該保護這些類型的訪問,所以我不重複的局部變量是爲了確保返回有效的值。
而且,延遲初始化可以在成員字段來完成,而不需要中間的局部變量:
if (linePattern == null) linePattern = Pattern.compile("...");
這看起來是一個字節碼優化,看到here和here。使用本地變量會產生較小的字節碼(較少的指令)以及較少的對實際值的訪問(這是一種昂貴的易失性讀取)。但是他們還沒有使用最終的變量優化,所以我對得出這個結論持懷疑態度。
但爲什麼不只是懶惰地初始化成員字段? – xst
該方法完全封裝。它用於獲取該字段的值並確保在需要時進行初始化。 – Wormbo
'if(linePattern == null)linePattern = new ...'這會懶惰地初始化成員字段而不是局部變量。 – xst