設計模式專題之單例模式
阿新 • • 發佈:2018-12-06
1.單例模式 惡漢式
特點:天生執行緒安全,效率高,但是不能延遲載入
package com.wangyu; /** * 單例模式 惡漢式 * 特點:天生執行緒安全,效率高,但是不能延遲載入 * @author zjmiec * */ public class SingletonDemo1 { // 類初始化立即載入 private static SingletonDemo1 instance = new SingletonDemo1(); private SingletonDemo1() {} public static SingletonDemo1 getInstance() { return instance; } }
2. 單例模式 懶漢式
package com.wangyu; import com.sun.corba.se.impl.orbutil.concurrent.Sync; /** * 單例模式 懶漢式 特點,效率低,支援延遲載入 資源利用率高了,但是併發效率低 synchronized 要同步 * * @author zjmiec * */ public class SingletonDemo2 { // 類初始化不會立即載入,用到的時候建立 private static SingletonDemo2 instance; private SingletonDemo2() { } public static synchronized SingletonDemo2 getInstance() { if (instance == null) { instance = new SingletonDemo2(); } return instance; } }
3. 雙重鎖機制實現單例模式
package com.wangyu; /** * * 雙重鎖機制實現單例模式 (由於jvm底層優化,使用過程會出現問題不建議使用) * * @author zjmiec * */ public class SingletonDemo3 { // 類初始化不會立即載入,用到的時候建立 private static SingletonDemo3 instance = null; private SingletonDemo3() { } public static synchronized 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; } }
4.靜態內部類方式實單例模式
package com.wangyu;
/**
*
* 靜態內部類方式實單例模式
* 特點:
* 沒有static屬性,不會像惡漢模式立即載入 只有真正呼叫的geiInstance,
* 才會載入靜態內部類,且載入過程執行緒安全
* instances是 static final型別,保證記憶體中只有一個例項,
* 而且只能被賦值一次 保證執行緒安全,同時兼備併發高效和延遲載入的優勢
*
* @author zjmiec
*
*/
public class SingletonDemo4 {
private static class SingletonClassInstance {
private static final SingletonDemo4 instance =new SingletonDemo4();
}
private SingletonDemo4() {
}
public SingletonDemo4 getInstance(){
return SingletonClassInstance.instance;
}
}
5.列舉方式實現單利模式
package com.wangyu;
/**
* 列舉方式實現單利模式(沒有延遲載入的屬性)
* 執行緒安全呼叫效率高
* @author zjmiec
*
*/
public enum SingletonDemo5 {
// 這個列舉元素,本身就是單例
INSTANCE;
//新增自己的操作
public void singletonOperation() {
}
}
測試:
對比總結:
常見的五種單例模式實現方式
一主要:
------餓漢式(執行緒安全,呼叫效率高。 但是,不能延時載入。 )。
------懶漢式(執行緒安全,呼叫效率不高。但是,可以延時載入。 )
一其他:
------雙重檢測鎖式(由於JVM底層內部模型原因,偶爾會出問題。不建議使用)。
------靜態內部類式(執行緒安全,呼叫效率高。但是,可以延時載入)
------列舉式(執行緒安全,呼叫效率高,不能延時載入。並且可以天然的防止反射和反序列化漏洞!)
如何選用?
-------單例物件佔用資源少,不需要延時載入:
列舉式好於餓漢式
------單例物件佔用資源大,需要延時載入:
靜態內部類式 好於懶漢式