單例物件屬性的更新 影子例項

2021-09-26 04:30:38 字數 1261 閱讀 9713

通常,為了實現配置資訊的實時更新,會有乙個執行緒不停檢測配置檔案或配置資料庫的內容,一旦發現變化,就更新到單例物件的屬性中。在更新這些資訊的時候,很可能還會有其他執行緒正在讀取這些資訊,造成意想不到的後果。還是以通過單例物件屬性停止執行緒服務為例,如果更新屬性時讀寫不同步,可能訪問該屬性時這個屬性正好為空(null),程式就會丟擲異常。

有兩種方法:

1,參照讀者/寫者的處理方式

設定乙個讀計數器,每次讀取配置資訊前,將計數器加1,讀完後將計數器減1。只有在讀計數器為0時,才能更新資料,同時要阻塞所有讀屬性的呼叫。**如下

public class globalconfig 

private static synchronized void syncinit()

} public static globalconfig getinstance()

return instance;

} public synchronized void update(string p_data)

private synchronized void syncupdatein() catch (exception e)

}} private synchronized void syncreadin()

private synchronized void syncreadout()

public vector getproperties()

}

2,採用"影子例項"的辦法

具體說,就是在更新屬性時,直接生成另乙個單例物件例項,這個新生成的單例物件例項將從資料庫或檔案中讀取最新的配置資訊;然後將這些配置資訊直接賦值給舊單例物件的屬性。如下面**所示。

public class globalconfig 

private static synchronized void syncinit()

} public static globalconfig getinstance()

return instance;

} public vector getproperties()

public void updateproperties()

}

注意:在更新方法中,通過生成新的globalconfig的例項,從檔案或資料庫中得到最新配置資訊,並存放到properties屬性中。

上面兩個方法比較起來,第二個方法更好,首先,程式設計更簡單;其次,沒有那麼多的同步操作,對效能的影響也不大。

「單例」的屬性訪問器

using system using system.collections using system.collections.generic using system.data using system.linq using system.reflection using system.linq.e...

php單例模式的例項

class config1 class config 轉殖方法私有化 禁止從外部轉殖物件 private function clone 因為用靜態屬性返回類例項,而只能在靜態方法使用靜態屬性 所以必須建立乙個靜態方法來生成當前類的唯一例項 public static function getinst...

php清空單例屬性 php的單例模式講解

場景 class mysql my1 new mysql my2 new mysql my3 new mysql 每new一次,連線一次資料庫 同時,多了乙個物件,增大的開銷 另一種場景 購物車 如果我開啟多個頁面,每個頁面例項了多個購物車 那麼下的訂單,可能會被裝在不同的購物車裡,出現錯誤.所以,...