我保持ReaderWriterLockSlim對象的字典資源訪問:(示例代碼是醜陋這裏,只是讓你明白我的目的)(C#)使汽車GC可能的解釋<ReaderWriterLockSlim>
static ConcurrentDictionary<string, ReaderWriterLockSlim> rwResourceLocks =
new ConcurrentDictionary<string, ReaderWriterLockSlim>();
並使用像這樣的:
if (ResourceStore.Exist("resourceID")) {
if (rwResourceLocks["resourceID"] == null) {
/* create a new lock in thread-safe way */
}
rwResourceLocks["resourceID"].EnderReadLock();
var rc = ResourceStore.GetResource("resourceID");
/* further use of rc... */
rwResourceLocks["resourceID"].ExitReadLock();
}
資源可動態增加或移除,其生命週期是不可預測的(無法mornitor去除資源),作爲資源量成長,rwResourceLocks的尺寸也在增加,這將導致內存麻煩。有沒有辦法解決這個問題? (很明顯,我不能簡單地調用rwResourceLocks.Clear()來做到這一點)
我知道這是一個有點複雜:(
有一個競爭條件:如果2個線程檢查同樣不存在'resourceID',然後他們都可以嘗試創建新鎖。希望這不是問題,或者你意識到這一點。目前還不清楚爲什麼你需要鎖來訪問的資源。你可以通過實現緩存來加速訪問(如果這是一個目標)。否則,不知道資源是否正在使用是否可以釋放它?如果是,則再次緩存。存儲每個資源的最後訪問時間,檢查(定期或添加新資源時),過期時免費。 – Sinatr
因爲這些資源不僅用於讀取,而且有時會進行修改,因此我會保留一個寫入鎖以防止在當時讀取它。 (例如文件資源) – ineztia