1. 程式人生 > >java double-check lazy load------effedctive java 第七十一條:慎用延遲初始化(這個變數的作用是確保field只在已經被初始化的情況下讀取一次)

java double-check lazy load------effedctive java 第七十一條:慎用延遲初始化(這個變數的作用是確保field只在已經被初始化的情況下讀取一次)

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區域性變數僅僅只是增加了一個引用,區域性變數的生命週期也很短,基本不會消耗什麼執行時間。