設計模式 單例的五種實現及分析

2022-08-18 00:18:10 字數 1235 閱讀 9685

單例模式是設計模式中最簡單的一種建立型模式,使用場景一般有:工具類物件、系統中只能存在乙個例項物件的類、建立頻繁或又耗時耗資源且又經常用到的物件等。如:jdk的runtime類就是飢餓的單例模式,以及spring容器管理的例項bean預設也是飢餓單例,在容器啟動時初始化,當然也可以設定為懶漢式(default-lazy-init="true")。再如程式中引入公共執行緒池,為防止多次建立執行緒池浪費資源,公共執行緒池也可以採用單例模式實現的。

類載入時預設初始化,實現最簡單但也有一定的侷限性,1、可能類載入時某些資源還未準備好,2、多個不同的自定義類載入器同時載入時可能導致重複初始化

public class hungrysingleton 

public static hungrysingleton getinstance()

}

public class lazysingleton 

/*** 一定要記得加synchronized

*/public static synchronized lazysingleton getinstance()

return instance;

}}

要注意執行緒安全隱患:多執行緒環境下獲取到未初始化完全的例項物件,用volatile修飾物件可以防止該問題,詳盡分析見下面注釋

public class doublechecksingleton 

public static doublechecksingleton getinstance() }}

return instance;

}

public class innerclasssingleton 

private static class nestclass

public static innerclasssingleton getinstance()

}

跟靜態內部類的原理是一樣的,jvm會保證enum不能被反射並且構造器方法只執行一次,因此該單例是執行緒安全的

public class enumsingleton 

private enum innerenum

public enumsingleton getinstance()

}public static enumsingleton getinstance()

}

五種單例模式實現

public class hunger private final static hunger hunger newhunger public static hunger getinstance 多個執行緒安全,但無法進行懶載入,如果類成員很多,則占用的資源比較多 public class lazy...

單例模式的五種實現

1.1懶漢式,執行緒不安全 單例模式在多執行緒的 應用場合下必須小心使用。如果當唯一例項尚未建立時,有兩個執行緒同時呼叫建立方法,那麼它們同時沒有檢測到唯一例項的存在,從 而同時各自建立了乙個例項,這樣就有兩個例項被構造出來,從而違反了單例模式中例項唯一的原則。解決這個問題的辦法是為指示類是否已經例...

設計模式系列(六)單例模式的五種實現

參考 對於系統中的某些類來說,只有乙個例項很重要,例如,乙個系統中可以存在多個列印任務,但是只能有乙個正在工作的任務 乙個系統只能有乙個視窗管理器或檔案系統 乙個系統只能有乙個計時工具或id 序號 生成器。單例模式可以使整個系統擁有乙個全域性的物件,方便資源的共享和系統行為的協調。一 餓漢式 pub...