幾種常用的單例模式
阿新 • • 發佈:2018-12-19
單例模式的作用是使該類在全域性中只存在一個例項。目的是當有其他類需要訪問時,不需要重複建立該例項,並且可以共享該類資料。
1.餓漢式
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return INSTANCE;
}
}
優點:在類載入時,就建立單例例項,避免的執行緒同步化。 缺點:可能後面不會使用該類,沒有達到延遲載入,造成記憶體資源的浪費。
2.懶漢式
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
雖然起到了懶載入的作用,但是隻能在單執行緒下使用。多執行緒使用可能導致建立多個例項。
3.雙重檢查式
public class Singleton { private static volatile Singleton singleton; private Singleton() {} public static Singleton getInstance() { if (singleton == null) { synchronized (Singleton.class) { if (singleton == null) { singleton = new Singleton(); } } } return singleton; } }
優點:延遲載入,安全,效率高。 在例項化時,會先判斷是否為空,在進一步加鎖判斷是否為空。如果例項化成功,後續呼叫該靜態例項時,就不需要在進入加鎖程式碼塊。
4.靜態內部類
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
該方法在類裝載時,不會立即例項化,需要呼叫靜態內部類後,才完成例項化。因為類的靜態屬性只會在類第一次載入的時候初始化,JVM保證了執行緒的安全性,在類初始化時,其他執行緒無法進入。