單例模式(Singleton Pattern)

2021-06-09 11:45:35 字數 1459 閱讀 9201

單例模式確保乙個類只有乙個例項,並提供乙個全域性訪問點。

某些物件我們只需要乙個,比如執行緒池、快取、登錄檔等等。如果這些類擁有多個例項,可能會產生很多問題。

使用單例模式可以確保我們使用的這些全域性資源只有乙份。

乙個經典的單例模式的實現:

public class singleton

public static singleton getinstance()

return uniqueinstance;

}}

由於singleton類沒有公共的構造方法,我們並不能直接建立這個類的例項,而是只能通過呼叫靜態的getinstance()方法來獲取對單例物件的乙個引用。當呼叫getinstance()時,如果該類還沒有任何例項則建立乙個例項並返回對它的引用,如果已存在乙個例項,則直接返回該例項的乙個引用。

這樣就確保了單例的類最多只能有乙個例項。

多執行緒下的隱患

在多執行緒的情況下,如果兩個執行緒幾乎同時呼叫getinstance()方法會發生什麼呢?有可能會建立出兩個該類的例項。

我們可以將getinstance()方法變為同步方法來解決這個問題:

public class singleton

public static synchronized singleton getinstance()

return uniqueinstance;

}}

效能問題

然而,事實上,我們只有在uniqueinstance為null的時候才需要進行同步,當這個類已經有例項之後就不存在多執行緒隱患了。

因此我們將getinstance()方法變為同步方法有可能很大程度的拖垮效能。

如果將getinstance()方法變為同步方法真的影響到了效能,我們可以選擇在靜態初始化時建立這個單例。

public class singleton

public static singleton getinstance()

}

這樣自然也能確保單例。

問題是,前面的例子中都是在需要乙個例項的時候在建立單例,這個例子中在類初始化時就建立了單例。如果這個物件非常耗資源,而程式中又一直沒有用到它,這樣便是在浪費資源了。

「雙重檢查加鎖」

public class singleton

public static singleton getinstance()

} } return uniqueinstance;

}}

這樣就可以在節省資源的同時確保正確性和高效性。只是實現方法有點不夠簡潔了。

單例模式 單例模式

餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...

單例 單例模式

簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...

單例模式 懶漢式單例模式

單例模式有餓漢時模式和懶漢式 單例模式也就是說同一類只返回乙個物件供外部類使用 懶漢式即延遲初始化單例。在多執行緒環境下,簡單的懶漢式會有執行緒安全。懶漢式單例模式解決線性安全問題如下 1 使用雙重檢查鎖機制解決執行緒安全問題。2 單例模式還有更好的解決方案,即使用靜態類方式。懶漢式單例模式典型 p...