單例模式的優點:
1.在內存中只有一個對象,節約內存
2.避免頻繁的創建和銷燬對象,可以提高性能
3.避免對共享資源的多重佔用
4.可以全局訪問
適用場景:
1.需要頻繁實例化然後銷燬的對象
2.創建對象時,耗時過多或者耗資源過多,但又經常用到的對象
3.有狀態的工具類對象
4.頻繁訪問數據庫或文件的對象
5.要求只有一個對象的場景
靜態內部類的方式實現單例
/*
* 單例模式,確保一個類只有一個實例,而且自動實例化,並向整個系統提供整個實例。
* 三個優點
* 1.jvm虛擬機本身的機制,保證了數據的線程安全
* 2.沒有使用關鍵字,synchronized,雖然這個關鍵字能保證線程安全,但是他非常的影響性能,
* 因爲他只有一個線程能讀取裏面的數據,另一個線程就不能讀取,靜態內部類的方式,可以同時讀取
* jvm本身的機制保證了線程安全,沒有性能缺陷
* 3.SingletonHolder類是私有的,只有getInstance()能對其進行訪問
*/
/*
* 第一次加載這個StaticInnerSingleton的時候,他不會初始化instance, 只有他第一次調用 getInstance()
* 這個方法之後,虛擬機纔會加載SingletonHolder類, 並初始化instance,這樣不僅能保證線程安全,也能保證single類的唯一性。
*/
/**
// 靜態內部類
* jvm提供的同步控制 static final static 區塊初始化數據,保證數據在內存中是獨一份的 final
* 變量初始化完成之後就無法被修改,所以final也是線程安全的
*
* 我們利用的是jvm進行類加載的時候會保證數據同步,所以我們就利用內部類原理,
* 在內部類裏創建對象的實例,這樣只要我們的應用中不使用這個內部類StaticInnerSingleton,
* 那麼jvm虛擬機他就不會去加載這個類,也就不會去創建我們所要創建的單例對象Instance,從而
* 這裏靜態內部類,就完成了懶漢式的延遲加載,同時又保證了線程安全
*/
public class StaticInnerSingleton {
private StaticInnerSingleton() {
}
public static StaticInnerSingleton getInstance() {
return SingletonHolder.mInstance;
}
private static class SingletonHolder {
private static final StaticInnerSingleton mInstance = new StaticInnerSingleton();
}
}