java double-check lazy load------effedctive java 第七十一條:慎用延遲初始化(這個變數的作用是確保field只在已經被初始化的情況下讀取一次)
阿新 • • 發佈:2018-12-19
private volatile FieldType field;
FieldType getField(){
FieldType result = field;
if(result==null){
synchronized(this){
result = field;
if(result == null){
field = result = computeFieldValue();
}
}
}
return result;
}
上面之所要加區域性變數result,是為了讓field在已經被初始化的情況下只被讀取一次(原書為:“這個變數的作用是確保field只在已經被初始化的情況下讀取一次”,應該是翻譯問題),
如果使用區域性變數,在被field已經被初始化的時候至少會被讀取兩次,一次判斷空,一次為“return field”
可能有人會疑惑新增加了一個變數應該會增加執行時間,但是由於field是被volatile修飾,被volatile修飾的變數每次讀取都是直接去記憶體中取值,是比較耗時的操作。result區域性變數僅僅只是增加了一個引用,區域性變數的生命週期也很短,基本不會消耗什麼執行時間。