JAVA中Singleton模式實用案例
工作上為了實作銀行內部使用的存摺磁條讀寫器的程式,因此需要防範不同程式間搶資源的狀況。
架構為多台client連接到同一台server,server上連接一台共用的磁刷機,由同一程式做外部裝置的控管。
為了讓某項周邊裝置同時間只有一個instance可存取,利用Singleton模式可以達到此效果。
網路上的範例:
這寫法,能夠給該物件使private static物件存在唯一的reference位置,此方式在同一個thread當中同時呼叫CommUtils,第一個thread順利取得instance,第二個thread則因為判斷出instance不為null的同一個物件,會回傳同一個instance。
但當不同的process執行時,則因為共用到同一個PORT而先出PortInUseException,不進入到此程式中。
事實上Synchronized內區塊在實測中無測試到。因此可用以下寫法簡化,不需要lazy initialization。
架構為多台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
留言
張貼留言