OOAD之單例模式Singleton的6種寫法

陳嘻嘻哈哈發表於2015-07-13

1  主要作用是保證在Java應用程式中,一個類Class只有一個例項存在。 

一 :第一種 餓漢式(預載入)

 1 public class Singleton {  
 2    private Singleton(){}////在自己內部定義自己一個例項,注意這是private 
 3     private static Singleton instance = new Singleton();  
 4   
 5     public static Singleton getInstance() {  
 6     return instance;  
 7     }  
 8 
 9      public static void main(String[] args) {
10     Singleton sing=Singleton.getInstance();
11     System.out.println(sing);
12   }
13 }  

二:第二種 餓汗式(變種)

 1 public class Singleton {  
 2      private Singleton (){}  
 3     private Singleton instance = null;  
 4     static {  
 5     instance = new Singleton();  
 6     }  
 7     
 8     public static Singleton getInstance() {  
 9     return this.instance;  
10     }  
11    public static void main(String[] args) {
12     Singleton sing=Singleton.getInstance();
13     System.out.println(sing);
14 }
15 }  

 

三:第三種 懶漢式(懶載入 執行緒不安全

 1 public class Singleton {  
 2     private Singleton(){}
 3     private static Singleton instance;  
 4   
 5     public static Singleton getInstance() {  
 6     if (instance == null) {  
 7         instance = new Singleton();  
 8     }  
 9     return instance;  
10     }  
11 
12     public static void main(String[] args) {
13     Singleton sing=Singleton.getInstance();
14     System.out.println(sing);
15 }
16 }  

四:第四種 懶漢式(單執行緒安全)

 1 public class Singleton {
 2     private Singleton(){}  
 3     private static Singleton instance;  
 4   
 5     public static synchronized Singleton getInstance() {  
 6     if (instance == null) {  
 7         instance = new Singleton();  
 8     }  
 9     return instance;  
10     }  
11 
12    public static void main(String[] args) {
13     Singleton sing=Singleton.getInstance();
14     System.out.println(sing);
15 }
16 }  

五:第五種  靜態內部類

 1 public class Singleton { 
 2     private Singleton (){}  
 3     private static class SingletonHolder {  
 4     private static final Singleton INSTANCE = new Singleton();  
 5     }  
 6     
 7     public static final Singleton getInstance() {  
 8     return SingletonHolder.INSTANCE;  
 9     } 
10    //因為SingletonHolder類沒有被主動使用,只有顯示通過呼叫getInstance方法時,才會顯示裝載SingletonHolder類,從而例項化instance。
11     
12 }  

 

 

六:第六種  雙重校驗鎖

 1 public class Singleton {  
 2     private volatile static Singleton instance=null;  
 3     private Singleton (){}  
 4     public static Singleton getInstance() {  
 5     if (instance== null) {  
 6         synchronized (Singleton.class) {  
 7         if (instance== null) {  
 8             instance= new Singleton();  
 9         }  
10         }  
11     }  
12     return instance;  
13     }  
14 } 

 

這種方式只是在初始化Singleton那部分程式碼的時候新增同步鎖,這樣提高了效率。

 


相關文章