五種常見的單例模式及其效率測試
阿新 • • 發佈:2019-01-04
所謂單例模式就是不管你此時new多少新物件,它只會創建出一個物件供你使用。
最基礎的兩種單例模式是:餓漢式和懶漢式。
而還有三種常見的單例模式:雙重檢測鎖模式、靜態內部類實現和列舉類實現模式。
懶漢式:
/** * 測試懶漢式單例模式 * 延時載入,用到了才建立物件,提高了資源的利用率。 * 但由於需要用到同步,導致併發效率很低。 * @author Administrator */ public class SingletonDemo2 { private static SingletonDemo2 s2; //構造器私有化 private SingletonDemo2() { } //這裡要加上同步,否則不能實現單例 public static synchronized SingletonDemo2 getInstance() { //判斷s2是否為空,如果為空,則建立一個新物件。 if(s2 == null) { s2 = new SingletonDemo2(); } return s2; } }
餓漢式:
/** * 測試餓漢單例模式 * 餓漢式單例模式無延時載入。 * @author Administrator */ public class SingletonDemo1 { //在建立物件的時候用類載入器初始化, //類載入器在載入的時候是一個天然的執行緒安全 //不需要用保持同步來保證執行緒安全 private static SingletonDemo1 instanc = new SingletonDemo1(); private SingletonDemo1(){ } //隨用隨載入,無延時 public static SingletonDemo1 getInstanc() { return instanc; } }
雙重檢測鎖:
-由於JVM底層內部模型原因,偶爾會出問題,不建議使用。所以相應程式碼不在這裡顯示了。
靜態內部類實現:
/** * 測試靜態內部類實現方式 * 延遲載入 * 執行緒安全 * 併發高效呼叫 * @author Administrator */ public class SingletonDemo3 { //靜態內部類,並私有化 private static class SingletonDemo3ClassInstance{ private static SingletonDemo3 instance = new SingletonDemo3(); } //沒有同步,呼叫效率高 public static SingletonDemo3 getinstance() { return SingletonDemo3ClassInstance.instance; } private SingletonDemo3(){ } }
列舉類:
/**
* 列舉式實現單例模式
* 執行緒安全
* 防止反射和反序列化操作破解
* 無延時載入
* @author Administrator
*/
public enum SingletonDemo4 {
//列舉元素是天然的執行緒安全
INSTANCE;
}
總結如下:
常見的五種單例模式實現方式
主要:
-餓漢式(執行緒安全,呼叫效率高;但是不能延時載入)
-懶漢式(執行緒安全,呼叫效率不高,但是可以延時載入)
其他:
-雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題,不建議使用)
-靜態內部類式(執行緒安全,呼叫效率高,但是,可以延時載入)
-列舉類(執行緒安全,呼叫效率高,防反射和反序列化,不能延時載入)
如何選用?
-單例物件 佔用資源少,不需要延時載入時:
列舉類 好於 餓漢式
-單例物件 佔用資源大,需要延時載入時:
靜態內部類式 好於 懶漢式
五種方式效率測試: