單例模式是設計模式中最簡單的一種建立型模式,使用場景一般有:工具類物件、系統中只能存在乙個例項物件的類、建立頻繁或又耗時耗資源且又經常用到的物件等。如: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...