在寫Spring Boot 2.0.2-webmvc源碼分析系列的文章時,當時提到了Servlet單例模式。所以就想著寫一篇文章來介紹以下單例模式,其實網(wǎng)上類似這種設計模式的文章很多,23種設計模式大家可能都看過,早些時候自己也都看過,基本上只對常用的幾種印象比較深刻,其余不常用的差不多都忘記了。既然提到了單例模式,那就仔細介紹一下。再加深一下印象。
單例模式定義:
單例模式,屬于創(chuàng)建類型的一種常用的軟件設計模式。通過單例模式的方法創(chuàng)建的類在當前進程中只有一個實例。
我覺得學習設計模式,主要可以從以下四個方面著手。
1、該設計模式的一般使用場景。
2、該設計模式的實現(xiàn)。
3、該設計模式主要解決的問題及優(yōu)點。
4、該設計模式的不足之處。
單例模式的一般使用場景,下面列舉常見的幾種:
1、一般的應用系統(tǒng)都有一個或多個屬性文件存放系統(tǒng)配置,這樣的應用可以使用一個單例對象來管理這些屬性文件 。
2、 網(wǎng)站的計數(shù)器,一般可以使用單例模式實現(xiàn),不然數(shù)據(jù)很難同步。
3、系統(tǒng)的日志應用,一般可以使用單例模式實現(xiàn),由于共享的日志文件一直處于打開狀態(tài),因為只能有一個實例去操作,否則內(nèi)容不好追加。
4、應用的配置信息讀取,一般也使用單例模式,由于配置文件是共享的資源。為了保證數(shù)據(jù)的唯一性,可以使用單例對象進行獲取。
5、線程池的設計一般也是采用單例模式,由于線程池要對池中的線程進行控制。
下面簡單列舉一下使用單例模式的優(yōu)點。
1、 由于單例模式在內(nèi)存中只有一個實例,所以一定程度上可以減少內(nèi)存消耗,特別是一個對象需要頻繁地創(chuàng)建銷毀時,會影響系統(tǒng)的性能,使用單例模式就非常明顯了。
2、由于單例模式只生成一個實例,當一個對象實例需要比較多的資源時,如讀取配置信息,則可以通過在應用啟動時直接產(chǎn)生一個單例對象,然后放入內(nèi)存的方式來優(yōu)化。
3、單例模式可以避免對資源的多重占用,例如一個寫文件操作,由于只有一個實例存在內(nèi)存中,避免對同一個資源文件的同時寫操作。
4、單例模式可以在系統(tǒng)設置全局的訪問點,優(yōu)化和共享資源訪問。
除了優(yōu)點之外,當然也還有一些不足:
1、單例模式?jīng)]有接口,如果需要擴展,每次都得改代碼。
2、使用的場景比較單調(diào),如果是在多場景不斷變化的實例對象最好不要使用單例,數(shù)據(jù)容易出問題。
下面簡單介紹以下實現(xiàn)方式,單例模式的實現(xiàn)方式有多種,不同的實現(xiàn)方式有不同的優(yōu)缺點,這里介紹一種生產(chǎn)環(huán)境中常用的實現(xiàn)方式(靜態(tài)內(nèi)部類實現(xiàn)),其它幾種方式也不建議使用,所以就不一一列舉了,掌握下面這種就夠用了。
public class Singleton {
private Singleton() { }
public static Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
private static class SingletonInstance{
static Singleton INSTANCE = new Singleton();
}
}
使用上面這種單例模式的好處可以保證以下幾點:
1、Singleton最多只有一個實例,前提是在不考慮反射突破訪問限制的情況下。
2、保證了即使在高并發(fā)情況下,也不會產(chǎn)生多個實例。
3、保證了在高并發(fā)情況下,不會訪問到未初始化完成的對象造成系統(tǒng)異常問題。