/**
* 測試單例模式:惡漢式
* 有點:線程安全,效率低,類一加載的時候就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()....");
}
}線程