LockManager 類別
LockManager 類別。
繼承階層架構
System.Object
Microsoft.TeamFoundation.Framework.Server.LockManager
命名空間: Microsoft.TeamFoundation.Framework.Server
組件: Microsoft.TeamFoundation.Framework.Server (在 Microsoft.TeamFoundation.Framework.Server.dll 中)
語法
'宣告
Public Class LockManager
public class LockManager
LockManager 型別會公開下列成員。
建構函式
名稱 | 說明 | |
---|---|---|
![]() |
LockManager | 建構函式 |
回頁首
方法
回頁首
備註
受管理的存放區實行方式的避免死結。 所有的鎖定,必須使用 LockManager 鎖定。 每個鎖定會指派一個層級 (在鎖定階層架構中的位置),而且任何作業可以高於階層架構中任何目前所保留的鎖定要求鎖定。
LockManager 支援的 「 具名鎖定 」 概念 e.g.當我們必須鎖定時,我們或許無法掌握穩定的物件在記憶體中的某些實體,但沒有只是這類實體的名稱。 範例包括信箱和資料庫。 任何信箱或資料庫相關聯的物件可以進出,我們只需要針對這類實體為它的名稱,例如資料庫或信箱號碼信箱 GUID 資料庫馬廄。 我們支援監視器鎖定和資料讀取器-寫入器鎖定的已命名的鎖定。
LockManager 也支援一般 」 物件的鎖定 」,當我們必須鎖定在記憶體中的特定物件執行個體。 僅監視器物件鎖定目前支援的鎖定相同的鎖定機制,如 C# 「 鎖定 」 陳述式中使用。 相對於 「 鎖定 」 陳述式,而 LockManager 物件鎖定完整參與鎖定階層架構中,因此我們可以確認使用正確的順序。
「 物件鎖定 」 的一個特殊的案例是 「 分葉物件鎖定 」。 我們不需要指定這類鎖定的鎖定層級-預期它永遠都是大部分巢狀結構的鎖定,並保留這類的分葉鎖定時能夠採取任何其他的鎖定。
藉由動態配置的鎖定物件的每一個唯一的名稱,並將它們儲存在全域的字典會實作 「 具名鎖定 」。 因此存取依名稱的已命名的鎖定要求字典的查詢,以尋找對應的鎖定物件。 被鎖定的物件字典應該本身會鎖定您執行這種參照。 所有這樣具名的鎖定可能價格比一般的鎖定,因為鎖定字典,字典查閱的額外成本。 我們使用兩種技術,以減少這類成本: (1) 分割鎖定物件字典中,為了避免字典的全域鎖定爭用,以及 (2) 提供呼叫者能夠快取的已命名的鎖定物件參考,並略過字典查詢大多數情況下。 請注意單獨分割不足,無法因為並沒有幫助大部分與相對的整個範圍的鎖定,例如資料庫鎖定 ; 例如,當每一個人想要抓取相同共用鎖定。
沒有鎖定的唯一名稱的可能未繫結的數目。 因此,我們可能造成的已命名的鎖定物件的數目也是未繫結。 具名的鎖定物件的參考儲存在全域的字典,因為這類物件都能永遠不會加以自動一併進行記憶體回收。 因此,我們希望能夠清除不經常使用的已命名的鎖定物件。 若要支援的已命名的鎖定物件的安全執行緒的清除,這類物件會是 refcounted。 每個已命名的鎖定物件上持有的鎖定需要有此類型的物件"addrefed"時,應釋放的參考之後就會釋放鎖定。 清除邏輯會檢查該物件目前不參考之前先將它從字典移除。 從字典移除的已命名的鎖定物件後,它會標記為處置,無法 addrefed 更加。 配置新的已命名的鎖定物件具有相同的名稱,並將其加入至字典,將導致嘗試下一次鎖定相同的名稱。 因此它是 [確定] 將過時命名鎖定物件參考呼叫端所快取-這類過時的參考會偵測到並更新,我們設法在鎖定它,以配置新的鎖定物件的下一次。
我們可以使用簡單的時間基礎啟發式技術來清除未使用的鎖定的物件。 在每 n 名為我們會檢查是否有一次執行 [清理],然後檢查字典,並收集最近沒有使用的所有未參考的物件的鎖定釋放呼叫。 然後我們嘗試處置這類的每個物件,並從字典移除它的參考。 清理的是每個字典資料分割,因此我們不需要鎖定其他磁碟分割,當我們執行清理任何給定之磁碟分割。
執行緒安全
這個型別的任何 Public static (在 Visual Basic 中為 Shared) 成員都具備執行緒安全。不保證任何執行個體成員是安全執行緒。