延遲載入與單例模式

2021-06-07 20:22:58 字數 1333 閱讀 8763

延遲載入,也較延遲例項化,延遲初始化等,主要表達的思想就是,把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。

當建立乙個物件的子物件開銷比較大時,而且有可能在程式中用不到這個子物件,那麼久可以考慮用延遲載入的方式來建立子物件。另外就是當乙個程式啟動時,需要建立多個物件,但僅有幾個物件需要立即使用,那麼可以將一些不必要的初始化工作延遲到使用的時候。這樣可以提高程式的啟動速度。

framwork4.0中提供了乙個包裝類lazy,可以輕鬆實現延遲載入。

今天就先從延遲載入開始學起。

一、延遲載入

1、class singleton

public static singleton getinstance()

return instance;}}

建構函式私有,方法靜態。

問題:無法保證執行緒安全,當有多個執行緒同時訪問getinstance的時候,此時若物件為空,就會出現會多個執行緒同時產生多個singleton物件。

此時我們可以修改一下上面的**,如下

public

class

singleton

public

static

singleton getinstance()}}

return

instance;}}

上述**使用了雙重鎖方式較好地解決了多執行緒下的單例模式實現。先看內層的if語句塊,使用這個語句塊時,先進行加鎖操作,保證只有乙個執行緒可以訪問該語句塊,進而保證只建立了乙個例項。再看外層的if語句塊,這使得每個執行緒欲獲取例項時不必每次都得加鎖,因為只有例項為空時(即需要建立乙個例項),才需加鎖建立,若果已存在乙個例項,就直接返回該例項,節省了效能開銷。

2、如果使用如下的單例模式

class singleton

public static singleton getinstance()

}這個方法保證了在第一次載入的時候例項被初始化,且保證了執行緒安全。但是為進一步要求,我們想要在使用的時候才才初始化singleton物件,及延遲載入。那麼可以使用如下方法。

3、延遲載入

public class singleton

private static class singletonholder

public static singleton getinstance()

public static void main(string args)

}方法中singleton 有乙個靜態內部類singletonholder,內部類在外部載入的時候並不會載入,在有在呼叫getinstance才回載入。另外singletonholder類使用private修飾以確保外部類不能訪問。

單例模式以及延遲載入

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

單例模式的延遲載入

發表於 2014 10 21 23 56 04 830人閱讀 分類 隨寫 延遲載入,也叫延遲例項化,延遲初始化等,主要表達的思想就是 把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。當建立乙個物件的子物件開銷比較大時,而且有可能在程式中用不到這個子物件,那麼就...

java實現多執行緒延遲載入的單例模式

package offer 靜態變數,靜態方法,靜態塊等都是類級別的屬性,而不是單純的物件屬性。他們在類第一次被使用時被載入 記住,是一次使用,不一定是例項化 我們可以簡單得用 類名.變數 或者 類名.方法來使用它們。靜態內部類的載入不需要依附外部類,在使用時才載入所以當外部類載入的時候不會載入內部...