1.餓漢模式(線程安全,調用效率高,可是不能延時加載):html
package com.yanwu.www.demo; /* * 測試單例模式 * * 餓漢模式 * * @author harvey * */ public class SingletonDemo1 { //類初始化時當即加載對象(沒有延遲加載的優點),自然的線程安全 private static SingletonDemo1 instance=new SingletonDemo1(); //構造器私有化 private SingletonDemo1(){} //方法沒有同步,調用效率高 public static SingletonDemo1 getInstance(){ return instance; } }
2.懶漢模式(線程安全,調用效率不高,可是能延時加載):java
package com.yanwu.www.demo; /* *測試單例模式 * *懶漢模式 * *@author harvey * */ public class SingletonDemo2 { //類初始化時,不初始化這個對象(延時加載,真正用的時候再建立) private static SingletonDemo2 instance; //構造器私有化 private SingletonDemo2(){} //方法同步,調用效率低 public static synchronized SingletonDemo2 getInstance(){ if(instance==null){ instance=new SingletonDemo2(); } return instance; } }
3.雙重檢測鎖模式(因爲JVM底層模型緣由,偶爾會出問題,不建議使用):安全
package com.yanwu.www.demo; /* * 單例模式 * * 雙重檢測鎖式 * * 因爲JVM底層內部模型原型,偶爾會出現問題,不建議使用 * * @author harvey */ public class SingletonDemo5 { private volatile static SingletonDemo5 SingletonDemo5; private SingletonDemo5() { } public static SingletonDemo5 newInstance() { if (SingletonDemo5 == null) { synchronized (SingletonDemo5.class) { if (SingletonDemo5 == null) { SingletonDemo5 = new SingletonDemo5(); } } } return SingletonDemo5; } }
4.靜態內部類式(線程安全,調用效率高,能夠延時加載):併發
package com.yanwu.www.demo; /* * 單例模式 * * 靜態內部類的實現 * * 1.外部類沒有static 屬性,不會像餓漢同樣當即加載對象 * * 2.只有真正調用getInstance()纔會加載靜態內部類,加載時是線程安全的 * * 3.兼併延時調用和併發高效調用 * * @author harvey * */ public class SingletonDemo3 { private static class SingletonClassInstance{ private static final SingletonDemo3 instance=new SingletonDemo3(); } private SingletonDemo3(){} public static SingletonDemo3 getInstance(){ return SingletonClassInstance.instance; } }
5.枚舉類(線程安全,調用效率高,不能延時加載,能夠自然的防止反射和反序列化調用):ide
package com.yanwu.www.demo; /* * 單例模式 * * 枚舉式實現 * * 1.避免了反射和反序列化的漏洞 * * 2.沒有延時加載的效果 * * @author harvey */ public enum SingletonDemo4 { //枚舉元素自己就是單例 INSTANCE; //添加本身須要的操做 public void singletonOperation(){ } }
如何選用:測試
-單例對象 佔用資源少,不須要延時加載,枚舉 好於 餓漢ui
-單例對象 佔用資源多,須要延時加載,靜態內部類 好於 懶漢式spa