單例延遲例項化

2021-09-01 15:14:00 字數 673 閱讀 6283

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的例項。如果配置檔案裡面有...

延遲載入與單例模式

延遲載入,也較延遲例項化,延遲初始化等,主要表達的思想就是,把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。當建立乙個物件的子物件開銷比較大時,而且有可能在程式中用不到這個子物件,那麼久可以考慮用延遲載入的方式來建立子物件。另外就是當乙個程式啟動時,需要建立多...

單例模式以及延遲載入

延遲載入,也叫延遲例項化,延遲初始化等,主要表達的思想就是 把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。當建立乙個物件的子物件開銷比較大時,而且有可能在程式中用不到這個子物件,那麼就可以考慮用延遲載入的方式來建立子物件。另外就是當乙個程式啟動時,需要建立多...