1.如果出於效能的考慮而需要對例項域使用延遲初始化,就使用雙重檢查模式(double-check idiom)。這種模式避免了在域被初始化後訪問這個域時的鎖定開銷。注意到例項域使用了volatile修飾符。
//double-check idiom for lazy initialization of instance fields
private volatile fieldtype field;
fieldtype getfield()
} return result;
}
使用區域性變數result的目的是為了提公升效能。
2.如果出於效能的考慮而需要對靜態域使用延遲初始化,就使用lazy initialization holder class模式。
// lazy initialization holder class idiom for static fields
private static class fieldholder
static fieldtype getfield()
這種模式的魅力在於getfield方法沒有被同步,因此延遲初始化實際上並沒有增加任何訪問成本。
3 延遲例項化物件
在預設情況下,程式一開始就會把配置檔案中的所有物件都進行例項化。為了驗證這一點,我們可以只在main方法裡只寫獲取上下文,不寫getobject。static void main string args 可以看到控制台列印了 建立了a的例項 說明執行了a的構造方法,建立的a的例項。如果配置檔案裡面有...
延遲載入與單例模式
延遲載入,也較延遲例項化,延遲初始化等,主要表達的思想就是,把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。當建立乙個物件的子物件開銷比較大時,而且有可能在程式中用不到這個子物件,那麼久可以考慮用延遲載入的方式來建立子物件。另外就是當乙個程式啟動時,需要建立多...
單例模式以及延遲載入
延遲載入,也叫延遲例項化,延遲初始化等,主要表達的思想就是 把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。當建立乙個物件的子物件開銷比較大時,而且有可能在程式中用不到這個子物件,那麼就可以考慮用延遲載入的方式來建立子物件。另外就是當乙個程式啟動時,需要建立多...