單例模式各類比較

/**
* 測試單例模式:惡漢式
* 有點:線程安全,效率低,類一加載的時候就new對象
* @author codeMan
*
*/
public class SingletonDemo1 {
private static SingletonDemo1 instance=new SingletonDemo1();

private SingletonDemo1(){

}
public static SingletonDemo1 getInstance(){

return instance;
}

public static void main(String[] args) {

}
}安全

 

 

/**
* 測試單例模式:懶漢式
* 有點:線程安全,效率高,類一加載的時候就new對象
* @author codeMan
*
*/
public class SingletonDemo2 {
private static SingletonDemo2 instance;

private SingletonDemo2(){

}
/* public static synchronized SingletonDemo2 getInstance(){

if(null==instance){
return instance=new SingletonDemo2();
}

return instance;
}*/
//資源不夠優化,能夠進行雙重檢查,註釋部分
public static SingletonDemo2 getInstance(){
//雙重檢查,提升效率
if(null==instance){
synchronized (SingletonDemo2.class) {
if(null==instance){
instance=new SingletonDemo2();
}

}

}

return instance;
}

}測試

 

/**
* 單例模式:靜態內部類實現單例
* 優勢:線程安全的,懶加載。
* 靜態內部類不會被加載,用到的時候纔會被加載
* @author codeMan
*
*/
public class SingletonDemo3 {
private static class SingletonClassInstance{
private static SingletonDemo3 instance=new SingletonDemo3();
}
private SingletonDemo3(){

}
public static SingletonDemo3 getInstance(){
return SingletonClassInstance.instance;
}
}優化

/**
* 單例模式:枚舉
* 優勢:線程安全的,不懶加載,能夠防止反序列化和反射。
* 靜態內部類不會被加載,用到的時候纔會被加載
* @author codeMan
*
*/
public enum SingletonDemo4 {
INSTANCE;

public void operation(){
System.out.println("operation()....");
}
}線程

相關文章
相關標籤/搜索