由於例項化是在初始化階段執行的,所以沒有執行緒安全的問題,但是潛在問題在於no-local static物件(函式外的static物件)在不同編譯單元(可理解為cpp檔案和其包含的標頭檔案)中的初始化順序是未定義的。如果在初始化完成之前呼叫 instance()方法會返回乙個未定義的例項。例如有兩個單例 singletona 和 singletonb ,都採用了 eager initialization ,那麼如果 singletona 的初始化需要 singletonb ,而這兩個單例又在不同的編譯單元,初始化順序是不定的,如果 singletona 在 singletonb 之前初始化,就會出錯。
這種方法的好處在於直到 instance() 被訪問,才會生成例項,這種特性被稱為延遲初始化(lazy initialization),這在一些初始化時消耗較大的情況有很大優勢。
lazy singleton不是執行緒安全的,比如現在有執行緒a和執行緒b,都通過了 ps == null 的判斷,那麼執行緒a和b都會建立新例項。單例模式保證生成唯一例項的規則被打破了。
程式設計模式 一 單例模式
一 單例模式的定義和特點 1.指乙個類只有乙個例項,且該類能自行建立例項的一種模式 2.特點 單例類只有乙個例項物件 3.該單例物件必須由單例類自行建立 4.單例類對外提供乙個訪問該單例的全域性訪問點 二 單例模式的優點和缺點 優點 1.單例模式可以保證記憶體中只有乙個例項,減少了記憶體開銷 2.可...
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...
Python 程式設計 單例模式
單例模式 singleton pattern 屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立,並提供一種訪問其唯一物件的方式。特點 1.單例類只能有乙個例項 2.單利類必須自己建立自己的唯一例項 3.單例類必須給其他物件...