前言 :
在某些時候, 為了管控資源或是避免多個物件分享相同資源造成的 Race condition, 我們希望在同一時間, 某個類別只會存在一個唯一的物件, 這時你便可以利用這個設計模式.
範例一 :
代碼說明 : 透過下面代碼, 我們透過統一的API 來獲得類別 Singleton 的物件, 只要該類別被建立過在接下來的 null 判斷就不在產生新的物件.
問題點 :
乍看好像可以滿足Singleton 的要求, 但如果是在多線程環境下呢? 可能某支Thread 正在產生物件同時, 另一支Thread 在 if(uniqueInstance==null) 判斷時也進入迴圈, 造成同一時間產生了一個以上的物件, 為了解決這個問題可以使用 synchronized 關鍵字 :
補充說明 :
* Wiki : Singleton pattern
* 史蒂芬新的筆記 : Singleton
在某些時候, 為了管控資源或是避免多個物件分享相同資源造成的 Race condition, 我們希望在同一時間, 某個類別只會存在一個唯一的物件, 這時你便可以利用這個設計模式.
範例一 :
代碼說明 : 透過下面代碼, 我們透過統一的API 來獲得類別 Singleton 的物件, 只要該類別被建立過在接下來的 null 判斷就不在產生新的物件.
- public class Singleton{
- private static Singleton uniqueInstance;
- private Singleton(){} // 使用Private 建構子, 確保類別Singleton 的物件化只能透過 API:getInstance()
- public static Singleton getInstance() {
- if(uniqueInstance == null ) {uniqueInstance = new Singleton();}
- return uniqueInstance;
- }
- }
乍看好像可以滿足Singleton 的要求, 但如果是在多線程環境下呢? 可能某支Thread 正在產生物件同時, 另一支Thread 在 if(uniqueInstance==null) 判斷時也進入迴圈, 造成同一時間產生了一個以上的物件, 為了解決這個問題可以使用 synchronized 關鍵字 :
- public class Singleton{
- private static Singleton uniqueInstance;
- private Singleton(){} // 使用Private 建構子, 確保類別Singleton 的物件化只能透過 API:getInstance()
- public static synchronized Singleton getInstance() { // 使用 synchronized 關鍵字避免同時兩支Thread 進入函數
- if(uniqueInstance == null ) {uniqueInstance = new Singleton();}
- return uniqueInstance;
- }
- }
補充說明 :
* Wiki : Singleton pattern
* 史蒂芬新的筆記 : Singleton
This message was edited 3 times. Last update was at 18/05/2010 15:41:58
請問有人在找Android 的工作嗎? 我們擴編需要找人
回覆刪除Jordan_chung@hotmail.com