最近看到一篇關於單例模式較為詳細的講解的文章:https://coolshell.cn/articles/265.html 下麵對此文章進行摘錄 (Java) // version 1.0 最為朴素的單例模式實踐; public class Singleton { private static Si ...
最近看到一篇關於單例模式較為詳細的講解的文章:https://coolshell.cn/articles/265.html 下麵對此文章進行摘錄 (Java)
// version 1.0 最為朴素的單例模式實踐; public class Singleton { private static Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton== null) { singleton= new Singleton(); } return singleton; } }
singleton特點:
- 私有(private)的構造函數,表明這個類是不可能形成實例了。這主要是怕這個類會有多個實例。
- 即然這個類是不可能形成實例,那麼,我們需要一個靜態的方式讓其形成實例:getInstance()。註意這個方法是在new自己,因為其可以訪問私有的構造函數,所以他是可以保證實例被創建出來的。
- 在getInstance()中,先做判斷是否已形成實例,如果已形成則直接返回,否則創建實例。
- 所形成的實例保存在自己類中的私有成員中。
- 我們取實例時,只需要使用Singleton.getInstance()就行了。
singleton多線程版本優化:
// version 1.4 多線程強化版本,使用雙重檢查和 volatile 進行屏蔽多線程作用; public class Singleton { private volatile static Singleton singleton = null; private Singleton() { } public static Singleton getInstance() { if (singleton== null) { synchronized (Singleton.class) { if (singleton== null) { singleton= new Singleton(); } } } return singleton; } }
// version 1.5 把類的創建委托給類裝載器來進行創建; public class Singleton { private volatile static Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } }
// version 1.6 使用私有內部類來進行隱藏,使得只有再getInstance 函數被調用的時候,類才會被闖將,使得類的創建可控; public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); } private Singleton (){} public static final Singleton getInstance() { return SingletonHolder.INSTANCE; } }
使用上面三個版本進行創建,都可以保證線程安全;具體相關的議論,可以參考:https://coolshell.cn/articles/265.html
保持更新;更多內容請關註cnblogs.com/xuyaowen;