java單例形式應用詳解。本站提示廣大學習愛好者:(java單例形式應用詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是java單例形式應用詳解正文
單例形式想必年夜家都曾經很熟習了,平日它的完成方法分為以下兩種:
//懶漢式完成
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 ...
}
}
在單利形式的應用中,懶漢式和餓漢式有分歧的運用場景,假如創立單利對象很占內存然則不是在運用啟動是必需應用的,我們普通會應用懶漢式,比及真的須要應用單利時才會去創立它,假如跟著項目啟動要立刻應用我們會應用餓漢形式在初始化是創立單利對象。
上述兩種形式中,假如在多線程的情形下,餓漢式不會湧現成績,由於JVM只會加載一次單利類,然則懶漢式能夠就會湧現反復創立單利對象的成績,是線程不平安的。
那有無方法,使餓漢式的單利形式也是線程平安的呢?謎底確定是有的,年夜家平日會應用加同步鎖的方法去完成,然則如許完成起來比擬費事,我們可以應用JVM的類加載機制去完成。在許多情形下JVM曾經為我們供給了同步掌握,好比:
a.在static{}區塊中初始化的數據
b.拜訪final字段時 等等。
在JVM停止類加載的時刻他會包管數據是同步的,我們可以如許完成:
采取類級外部類,在這個外部類外面去創立對象實例。如許的話,只需不應用類級外部類他就不會去創立對象實例,從而完成懶漢式的延遲加載和線程平安。
public class Singleton{
//外部類,在裝載該外部類時才會去創立單利對象
private static class SingletonHolder{
public static Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton newInstance(){
return SingletonHolder.instance;
}
public void doSomething(){
//do something
}
}
如許便可以完成線程平安的餓漢式單利形式。
別的我們還可以經由過程列舉類型來完成單利形式,這也是比擬推舉的方法。
應用列舉類型完成單例形式以下:
public enum Singleton{
//界說一個列舉的元素,它就是Singleton的一個實例
instance;
public void doSomething(){
// do something ...
}
}
Ok,單例形式先引見到這裡。