java單例模式使用詳解
單例模式想必大家都已經很熟悉了,通常它的實現(xiàn)方式分為以下兩種:
//懶漢式實現(xiàn)
public class Singleton{
private static Singleton instance = null;
private Singleton(){}
public static newInstance(){
if(null == instance){
instance = new Singleton();
}
return instance;
}
public void doSomething(){
// Do something ...
}
}
//餓漢式
public class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton newInstance(){
return instance;
}
public void doSomething(){
// Do something ...
}
}
在單利模式的使用中,懶漢式和餓漢式有不同的應用場景,如果創(chuàng)建單利對象很占內存但是不是在應用啟動是必須使用的,我們一般會使用懶漢式,等到真的需要使用單利時才會去創(chuàng)建它,如果隨著項目啟動要立即使用我們會使用餓漢模式在初始化是創(chuàng)建單利對象。
上述兩種模式中,如果在多線程的情況下,餓漢式不會出現(xiàn)問題,因為JVM只會加載一次單利類,但是懶漢式可能就會出現(xiàn)重復創(chuàng)建單利對象的問題,是線程不安全的。
那有沒有辦法,使餓漢式的單利模式也是線程安全的呢?答案肯定是有的,大家通常會使用加同步鎖的方式去實現(xiàn),但是這樣實現(xiàn)起來比較麻煩,我們可以利用JVM的類加載機制去實現(xiàn)。在很多情況下JVM已經為我們提供了同步控制,比如:
a.在static{}區(qū)塊中初始化的數(shù)據
b.訪問final字段時 等等。
在JVM進行類加載的時候他會保證數(shù)據是同步的,我們可以這樣實現(xiàn):
采用類級內部類,在這個內部類里面去創(chuàng)建對象實例。這樣的話,只要不使用類級內部類他就不會去創(chuàng)建對象實例,從而實現(xiàn)懶漢式的延遲加載和線程安全。
public class Singleton{
//內部類,在裝載該內部類時才會去創(chuàng)建單利對象
private static class SingletonHolder{
public static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton newInstance(){
return SingletonHolder.instance;
}
public void doSomething(){
//do something
}
}
這樣就可以實現(xiàn)線程安全的餓漢式單利模式。
另外我們還可以通過枚舉類型來實現(xiàn)單利模式,這也是比較推薦的方式。
使用枚舉類型實現(xiàn)單例模式如下:
public enum Singleton{
//定義一個枚舉的元素,它就是Singleton的一個實例
instance;
public void doSomething(){
// do something ...
}
}
Ok,單例模式先介紹到這里。
相關文章
Springboot輕量級的監(jiān)控組件SpringbootAdmin
這篇文章主要為大家介紹了Springboot輕量級的監(jiān)控組件SpringbootAdmin使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02java日期操作工具類(獲取指定日期、日期轉換、相隔天數(shù))
這篇文章主要為大家詳細介紹了java日期操作工具類,包括獲取指定日期、日期轉換、相隔天數(shù)等操作,感興趣的小伙伴們可以參考一下2016-06-06