文化中心借來一本O'Reilly出版的Head First Design Patterns,的確是寫得相當好的Java書。但我沒料到的是,以為第二簡單的Singleton Pattern(最簡單的是Iterator),原來我還是存著不少誤解。使用Singleton的觀念匯整如下:
- 使用全域變數率先實體化會比Singleton延遲實體還要浪費資源。
- 若使用兩個以上class loader,還是可能出現Singleton有多個現象。
- 不建議使用static class,因為static class的初始化是被JVM掌握,而非程式,可能有潛在Bug。
- 在Multi-Threads下,需要在getInstance()前加synchronized防止有兩個thread進入存取,但效能可能下降100倍。是故有以下兩種解法:
- private statice Singleton uniqueInstance = new Singleton(); // 不採延遲實體化方式
- 使用JDK 5.0才有的double-checked locking,在getInstance()內容寫法如下:
private volatile static Singleton uniqueInstance; // volatile確保初始化Singleton實體時,實體可正確被Multi-Threads存取
private static Singleton getInstance() { // JDK 1.4及更早版本不適用
if (uniqueInstance == null) {
synchronized (Singleton.class) {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
}
這招是另一位Bob Lee寫的Singleton,相當Simple:
public class Singleton {
static class SingletonHolder {
static Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
全站熱搜