JAVA中Singleton模式實用案例

工作上為了實作銀行內部使用的存摺磁條讀寫器的程式,因此需要防範不同程式間搶資源的狀況。

架構為多台client連接到同一台server,server上連接一台共用的磁刷機,由同一程式做外部裝置的控管。

為了讓某項周邊裝置同時間只有一個instance可存取,利用Singleton模式可以達到此效果。

網路上的範例:
 class CommUtils{  
      //使用Singleton 模式使得一個類別只有能一個實例。用getInstance取得控制權  
      private static CommUtils instance = null;  
      private CommUtils(){}  
   public static CommUtils getInstance() {  
     if (instance == null){  
       synchronized(CommUtils.class){  
         if(instance == null) {  
            instance = new CommUtils();  
         }  
       }  
     }  
     return instance;  
   }  
 ...  
 }  

這寫法,能夠給該物件使private static物件存在唯一的reference位置,此方式在同一個thread當中同時呼叫CommUtils,第一個thread順利取得instance,第二個thread則因為判斷出instance不為null的同一個物件,會回傳同一個instance。


但當不同的process執行時,則因為共用到同一個PORT而先出PortInUseException,不進入到此程式中。


事實上Synchronized內區塊在實測中無測試到。因此可用以下寫法簡化,不需要lazy initialization。

public class CLASS {
    static private CLASS obj= new CLASS();
    private CLASS(){}
    static public CLASS getInstance() {
        return obj;
    }
}




reference:
http://openhome.cc/Gossip/DesignPattern/SingletonPattern.htm
http://www.javaworld.com.tw/jute/post/view?bid=44&id=3939&sty=1&tpg=2&age=0

留言

這個網誌中的熱門文章

[專案] 銀行端末系統

如何在MacOS 中自由切換不同Python版本 - pyenv + virtualenv

用 C# 控制 Win7 輸入法