延遲載入,也較延遲例項化,延遲初始化等,主要表達的思想就是,把物件的建立延遲到使用的時候建立,而不是物件例項化的時候建立。這種方式避免了效能的浪費。
當建立乙個物件的子物件開銷比較大時,而且有可能在程式中用不到這個子物件,那麼久可以考慮用延遲載入的方式來建立子物件。另外就是當乙個程式啟動時,需要建立多個物件,但僅有幾個物件需要立即使用,那麼可以將一些不必要的初始化工作延遲到使用的時候。這樣可以提高程式的啟動速度。
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 靜態變數,靜態方法,靜態塊等都是類級別的屬性,而不是單純的物件屬性。他們在類第一次被使用時被載入 記住,是一次使用,不一定是例項化 我們可以簡單得用 類名.變數 或者 類名.方法來使用它們。靜態內部類的載入不需要依附外部類,在使用時才載入所以當外部類載入的時候不會載入內部...