文化中心借來一本O'Reilly出版的Head First Design Patterns,的確是寫得相當好的Java書。但我沒料到的是,以為第二簡單的Singleton Pattern(最簡單的是Iterator),原來我還是存著不少誤解。使用Singleton的觀念匯整如下:

  1. 使用全域變數率先實體化會比Singleton延遲實體還要浪費資源。
  2. 若使用兩個以上class loader,還是可能出現Singleton有多個現象。
  3. 不建議使用static class,因為static class的初始化是被JVM掌握,而非程式,可能有潛在Bug。
  4. 在Multi-Threads下,需要在getInstance()前加synchronized防止有兩個thread進入存取,但效能可能下降100倍。是故有以下兩種解法:
    1. private statice Singleton uniqueInstance = new Singleton();  // 不採延遲實體化方式
    2. 使用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;     
  }        
}
arrow
arrow
    全站熱搜

    Jemmy 發表在 痞客邦 留言(0) 人氣()