java單例模式幾種實現方式

單例模式的五種實現方式

一、餓漢式(線程安全,調用效率高,可是不能延時加載):java

1
2
3
4
5
6
7
public  class  ImageLoader{ 
      private  static  ImageLoader instance =  new  ImageLoader; 
      private  ImageLoader(){} 
      public  static  ImageLoader getInstance(){  
           return  instance;  
      
}

一上來就把單例對象建立出來了,要用的時候直接返回便可,這種能夠說是單例模式中最簡單的一種實現方式。可是問題也比較明顯。單例在尚未使用到的時候,初始化就已經完成了。也就是說,若是程序從頭到位都沒用使用這個單例的話,單例的對象仍是會建立。這就形成了沒必要要的資源浪費。因此不推薦這種實現方式。安全

 

2.懶漢式(線程安全,調用效率不高,可是能延時加載):ide

複製代碼
public class SingletonDemo2 {
     
    //類初始化時,不初始化這個對象(延時加載,真正用的時候再建立)
    private static SingletonDemo2 instance;
     
    //構造器私有化
    private SingletonDemo2(){}
     
    //方法同步,調用效率低
    public static synchronized SingletonDemo2 getInstance(){
        if(instance==null){
            instance=new SingletonDemo2();
        }
        return instance;
    }
}
複製代碼

 

3.Double CheckLock實現單例:DCL也就是雙重鎖判斷機制(因爲JVM底層模型緣由,偶爾會出問題,不建議使用):spa

public class SingletonDemo5 {
 2         private volatile static SingletonDemo5 SingletonDemo5;
 3  
 4         private SingletonDemo5() {
 5         }
 6  
 7         public static SingletonDemo5 newInstance() {
 8             if (SingletonDemo5 == null) {
 9                 synchronized (SingletonDemo5.class) {
10                     if (SingletonDemo5 == null) {
11                         SingletonDemo5 = new SingletonDemo5();
12                     }
13                 }
14             }
15             return SingletonDemo5;
16         }
17     }
複製代碼
 1 public class SingletonDemo5 {
 2         private volatile static SingletonDemo5 SingletonDemo5;
 3  
 4         private SingletonDemo5() {
 5         }
 6  
 7         public static SingletonDemo5 newInstance() {
 8             if (SingletonDemo5 == null) {
 9                 synchronized (SingletonDemo5.class) {
10                     if (SingletonDemo5 == null) {
11                         SingletonDemo5 = new SingletonDemo5();
12                     }
13                 }
14             }
15             return SingletonDemo5;
16         }
17     }
複製代碼

 

4.靜態內部類實現模式(線程安全,調用效率高,能夠延時加載)線程

public class SingletonDemo3 {

private static class SingletonClassInstance{
private static final SingletonDemo3 instance=new SingletonDemo3();
}

private SingletonDemo3(){}

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

}code

複製代碼
 1 public class SingletonDemo3 {
 2      
 3     private static class SingletonClassInstance{
 4         private static final SingletonDemo3 instance=new SingletonDemo3();
 5     }
 6      
 7     private SingletonDemo3(){}
 8      
 9     public static SingletonDemo3 getInstance(){
10         return SingletonClassInstance.instance;
11     }
12      
13 }
複製代碼

 

5.枚舉類(線程安全,調用效率高,不能延時加載,能夠自然的防止反射和反序列化調用)對象

public enum SingletonDemo4 {

//枚舉元素自己就是單例
INSTANCE;

//添加本身須要的操做
public void singletonOperation(){
}
}blog

複製代碼
1 public enum SingletonDemo4 {
2      
3     //枚舉元素自己就是單例
4     INSTANCE;
5      
6     //添加本身須要的操做
7     public void singletonOperation(){     
8     }
9 }
複製代碼

 

 

如何選用:ci

-單例對象 佔用資源少,不須要延時加載,枚舉 好於 餓漢資源

-單例對象 佔用資源多,須要延時加載,靜態內部類 好於 懶漢式

相關文章
相關標籤/搜索