您好,登錄后才能下訂單哦!
單例模式
單例模式的優點:
由于單例模式只生成一個實例,減少了系統性能開銷,當一個對象產生需要比較多資源時,如讀取配置,產生其他依賴對象時,則可以通過啟動時直接產生一個單例對象,然后永久的駐留在內存的方式解決
單例模式的實現:
有五中方式
1. 餓漢式
2. 懶漢式
3. 雙重檢測鎖實現
4. 靜態內部類實現
5. 枚舉類型實現
下邊對五中類型做詳細筆記
餓漢式單例模式
餓漢式特點:線程安全,調用效率高,但是不能延時加載
缺點:如果只是加載類,而不調用類中的方法,則會造成資源浪費
餓漢式實現:
1. 在定義類中定義一個靜態變量,然后創建類對象賦值給靜態變量,
2. 構造器要私有化
3. 定義靜態方法返回靜態變量
代碼:
public class SingletonDemo1 { //類初始化時,立即加載這個對象(沒有延時加載的優勢)。加載類時,天然的是線程安全的! private static SingletonDemo1 instance = new SingletonDemo1(); private SingletonDemo1(){ } //方法沒有同步,調用效率高! public static SingletonDemo1 getInstance(){ return instance; } }
懶漢式單例模式
懶漢式特點:線程安全,調用效率不高,但是可以延時加載
缺點:資源利用率高了,但是每次調用getInstance()方法都要同步,并發效率低
懶漢式實現:
1. 在定義的類中定義一個私有的靜態變量,不用賦值
2. 構造方法私有化
3. 對getInstance()方法加鎖synchronized,方法中只創建一次對象,對靜態變量賦一次值
代碼:
public class SingletonDemo2 { //類初始化時,不初始化這個對象(延時加載,真正用的時候再創建)。 private static SingletonDemo2 instance; private SingletonDemo2(){ //私有化構造器 } //方法同步,調用效率低! public static synchronized SingletonDemo2 getInstance(){ if(instance==null){ instance = new SingletonDemo2(); } return instance; } }
雙重檢測鎖實現單例
雙重檢測鎖特點:實現了懶加載和調用效率高的特點
缺點:由于編譯器優化原因和jvm底層內部模型原因,偶爾會出現問題,不建議使用
雙重檢測鎖實現:
public class SingletonDemo3 { private static SingletonDemo3 instance = null; public static SingletonDemo3 getInstance() { if (instance == null) { SingletonDemo3 sc; synchronized (SingletonDemo3.class) { sc = instance; if (sc == null) { synchronized (SingletonDemo3.class) { if(sc == null) { sc = new SingletonDemo3(); } } instance = sc; } } } return instance; } private SingletonDemo3() { } }
靜態內部類實現單例
靜態內部類特點:線程安全,調用效率高,懶加載
靜態內部類單例實現:
1. 定義的類中定義一個靜態內部類,靜態內部類中定義一個靜態常量,創建對象賦值給靜態常量
2. 構造方法私有化
3. 定義getInstance()方法返回靜態內部類中定義的靜態常量
代碼:
public class Singleto nDemo4 { private static class SingletonClassInstance { private static final SingletonDemo4 instance = new SingletonDemo4(); } private SingletonDemo4(){ } //方法沒有同步,調用效率高! public static SingletonDemo4 getInstance(){ return SingletonClassInstance.instance; } }
枚舉實現單例
枚舉實現特點:線程安全,沒有懶加載,調用效率高,實現簡單,枚舉本身就是單例模式,由JVM從根本上提供保障,避免通過反射和反序列化的漏洞
缺點:無延遲加載
枚舉實現單例:
定義枚舉類
在枚舉類中定義一個元素
定義返回枚舉中定義的元素
代碼:
public enum SingletonDemo5 { //這個枚舉元素,本身就是單例對象! INSTANCE; //添加自己需要的操作! public void singletonOperation(){ System.out.println("枚舉實現單例模式"); } }
單例模式總結
主要:
餓漢式(線程安全,調用效率高,不能延時加載)
懶漢式(線程安全,調用效率不高,可以延時加載)
其他
雙重檢測鎖式(由于jvm底層內部模型原型,偶爾會出現問題,不建議使用)
靜態內部類(線程安全,調用效率高,可以延時加載)
枚舉式(線程安全,調用效率高,不能延時加載,并且可以天然的防止反射和反序列化漏洞)
如何選用?
單例對象 占用資源少,不需要延時加載
枚舉好于餓漢式
單例對象 占用資源大,需要延時加載
靜態內部類好于懶漢式
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。