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「という名前のロック」の概念をサポートしている電子.g.をない可能性があります安定のオブジェクト メモリにいくつかのエンティティをロックする必要がある場合は、このようなエンティティの名前だけをがあります。例は、メールボックスとデータベースです。メールボックスまたはデータベースに関連付けられたすべてのオブジェクトに移動し、ことができます、育成はようなエンティティの名前、メールボックス データベースまたはメールボックスの GUID データベースなどの私たちのすべてがあります。私たちはモニターのロックと読み取り/書き込みロック名前付きロックをサポートします。
LockManager もサポートしています通常「ロック オブジェクト」と私たちする必要がありますロックは、特定のオブジェクト インスタンスのメモリ。C#「ロック」のステートメントで使用するためのメカニズムは、同じオブジェクトのロックは、ロックが現在サポートされているモニターだけをロックします。「ロック」ステートメント、ロック階層では、オブジェクトのロックを完全に参加 LockManager のとは対照的にそのためこれらが正しい順序で使用されます確認できます。
「ロックのオブジェクト」の 1 つの特殊なケースは、「リーフ オブジェクト ロック」です。私たちのようなロックのロック レベルを指定する必要はありません - それは、常に多くの入れ子のロックにする必要し、ロックは他のような葉のロックを保持すると取得できません。
「という名前のロック」動的に、ロック オブジェクトはそれぞれ一意の名前を割り当てるし、グローバル辞書に格納するために実装されます。したがって名前によって、名前付きのロックへのアクセスには、ロックの対応するオブジェクトを検索するには、辞書の検索が必要です。このようなルックアップを実行している間、ロック オブジェクトのディクショナリ自体ロックする必要があります。この名前付きロック可能性がありますロックは通常より高価、辞書、辞書検索をロックするための追加コストできます。このようなコストを削減するのには、2 つの方法を使用して: 分割 (1) 辞書のグローバル ロックの競合を減らすためには、オブジェクトのディクショナリをロックと (2) 呼び出し名前付きロック オブジェクトへの参照をキャッシュして、辞書の検索時間のほとんどをバイパスする機能を提供します。データベース ロックなどの比較的範囲の全体にわたるロックでは解決しないため単独で分割できないことに注意してください。 たとえば、みんな同じを取得しようとロックを共有します。
潜在的に無限の数のロックの一意の名前です。したがって、作成できます可能性のある名前付きのロック オブジェクトの数も、指定しません。名前付きロック オブジェクトへの参照をグローバル辞書に格納されているため、このようなオブジェクトはガベージ コレクションを自動的にできませんでした。したがって、定期的に使用されていない名前付きロック オブジェクトをクリーンアップできるようにします。名前付きのロック オブジェクトのスレッド セーフなクリーンアップをサポートするには、このようなオブジェクトを refcounted です。"Addrefed"のようなオブジェクトを持つすべてのロックを上の名前付きのロック オブジェクトを取得する必要があります、ロックが解放された後も、参照を解放する必要があります。クリーンアップ ロジックは現在、辞書から削除する前に参照されていないことを確認します。辞書から、名前付きのロック オブジェクトが削除され、破棄としてマークされています addrefed それ以上することはできません。次に、同じ名前をロックしようと同じ名前を持つ新しい名前付きのロック オブジェクトの割り当てとをディクショナリに追加になります。したがって、OK 古いロックのオブジェクト参照は、呼び出し元によってキャッシュという名前です - このような古い参照の発見し次回、ロックし、ロックの新しいオブジェクトを割り当てるしようとすると、更新されます。
未使用のロック オブジェクトをクリーンアップするにはヒューリスティック ベースの簡単な時間を使用します。N にロックの解放呼び出しのクリーンアップを実行し、辞書を調べます、最近使用されていないすべての参照されていないオブジェクトを収集するには、時間があればチェックの名前。すべてのオブジェクトを破棄してからディクショナリへの参照を削除するには、試行します。私たち私たちは指定されたパーティションのクリーンアップを実行すると、他のパーティションをロックする必要はありませんように辞書のパーティションごとにクリーンアップです。
スレッド セーフ
この型のすべてのパブリック static (Visual Basic では Shared) メンバーは、スレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。