單例是指一個類僅有一個實例,經過提供的方法來做爲全局的訪問點html
實現例子以下public enum SingleTonEnum{
INSTANCE;
public static final SingleTonEnum getInstance(){
return INSTANCE;
}
}
複製代碼
單例的優點java
單例實現的最困難方式在於,如何才能保證「全局」有且僅有一個實現,這裏的「全局」則是針對不一樣的使用場景來作各自的應用便可。好比如今的應用都會部署到多臺機器上,每臺機器上都會有各自的jvm,那是否有必要保證全部的機器上都是同一個單例呢?或者能夠僅僅把全侷限定在單個jvm呢?git
通常來說,限定在jvm便可github
當前通常的實現方式包括 使用枚舉、雙重檢查、靜態內部類與餓漢式等等spring
餓漢式與靜態內部類相比,區別在於建立實例的時機,靜態內部類須要用到的時候才加載,餓漢式則至關於類加載的時候就建立,餓漢實現的例子好比jdk自帶的 Runtime 類,就是典型的應用bash
歡迎找到反射實現單例的同窗一塊兒探討,我的驗證代碼戳這裏jvm
另外對於自定義類加載器,只要是遵循雙親加載模式的類加載器都能實現單例ui
實際上沒有用到本身的類加載器,實現相同的類加載器spa
各實現方式在不一樣場景下驗證單例方式詳情請戳這裏code
spring能夠在bean文件中設置建立的bean指定使用域爲"singleton"
<bean id="paxi" class="maokitty.paxi"></bean>
複製代碼
這種方式它默認就是實現了一個singleton,它是針對每一個IOC容器實現的
固然經過指定不一樣的id,它也會爲成功的建立另外一個實例,這也就是單例"全局"所特定的範疇。spring singleton源碼追蹤記錄請戳這裏
不但願其它地方再建立一個實例的場景