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 | コンストラクター |
このページのトップへ
メソッド
名前 | 説明 | |
---|---|---|
AssertLockHeld(Object, LockManager.LockType, Int64) | 特定のロックを現在のスレッドによって保持されていることをアサートします (デバッグはアサートします)。 | |
AssertLockHeld(ILockName, LockManager.LockType, Int64) | 特定のロックを現在のスレッドによって保持されていることをアサートします (デバッグはアサートします)。 | |
AssertLockNotHeld(Object, LockManager.LockType, Int64) | 特定のロックを現在のスレッドによって保持されていることをアサートします (デバッグはアサートします)。 | |
AssertLockNotHeld(ILockName, LockManager.LockType, Int64) | 特定のロックを現在のスレッドによって保持されていることをアサートします (デバッグはアサートします)。 | |
AssertNoLocksHeld(Int64) | 現在のスレッドが LockManager のロックを保持することを保持します。 | |
AssertNoLocksHeld(LockManager.LockType, Int64) | 特定のロックを現在のスレッドによって保持されていることをアサートします (デバッグはアサートします)。 | |
AssertZeroActiveLockObjects | refcount > (0)。多くの敵に識別設定がロック マネージャーのアクティブなロックであることを表しています | |
CompareLockTypes | ロックの種類が対応でない場合) を 2 種類のロックの種類 (スロー比較します。 | |
Equals | 指定のオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (Object から継承されます。) | |
Finalize | オブジェクトがガベージ コレクションにより収集される前に、そのオブジェクトがリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 (Object から継承されます。) | |
GetHashCode | 既定のハッシュ関数として機能します。 (Object から継承されます。) | |
GetLock(Object, LockManager.LockType, Int64) | ロックを取得します。 | |
GetLock(ILockName, LockManager.LockType, Int64) | 名前付きロックを取得します。 | |
GetType | 現在のインスタンスの Type を取得します。 (Object から継承されます。) | |
HasLocks | この requestId がロックを所有している場合、true を返します | |
Lock(Object, Int64) | 特定のオブジェクトのリーフのモニター ロックを取得します。 | |
Lock(Object, LockManager.LockType, Int64) | オブジェクトのモニター ロックを取得します。 | |
Lock(ILockName, LockManager.LockType, Int64) | 名前付きロックを取得します。 | |
MemberwiseClone | 現在の Object の簡易コピーを作成します。 (Object から継承されます。) | |
ReleaseAnyLock | 特定の種類のロックおよびロックの最も入れ子になった名前を解放します。 | |
ReleaseLock(Object, LockManager.LockType, Int64) | ロックを解放します。 | |
ReleaseLock(ILockName, LockManager.LockType, Int64) | 名前付きロックを解放します。 | |
TestLock(Object, LockManager.LockType, Int64) | このスレッドが既にロックを保持してテストします。 | |
TestLock(String, LockManager.LockType, Int64) | このスレッドが既にロックを保持してテストします。 | |
ToString | 現在のオブジェクトを表す文字列を返します。 (Object から継承されます。) | |
TryGetLock(Object, LockManager.LockType, Int64) | ロックの取得を試みます。 | |
TryGetLock(ILockName, LockManager.LockType, Int64, Int32) | 名前付きロックを取得します |
このページのトップへ
解説
マネージ ストアはデッドロックを回避する方法。 すべてのロックは LockManager のロックを使用する必要があります。 すべてのロックはレベル (ロックの階層の位置) を割り当て、いずれの操作も、現在の階層のロックより高いロックを要求できます。
たとえば LockManager は、サポート クラスに、は、エンティティをロックしてメモリが安定してオブジェクトを持つ include このようなエンティティの名前だけを持つという名前のロック」の概念。 メールボックス例は、データベースです。 メールボックスに関連付けられた views またはデータベースには、このようなエンティティのは安定した名前が、メールボックスのデータベースまたはメールボックス数のデータベースの GUID などのナビゲーション コントロールはすべて、ままに進むことができます。 ここでは、モニター ロックをサポートし、リーダー ライター ロックするには、名前付きのロックします。
LockManager は、最初にメモリの特定のオブジェクトのインスタンスをロックする必要がある場合は、一般的な「オブジェクトをロックして」サポートします。 ロックのみを現在サポートされているオブジェクトのロック、そのために、C の「ロック」の明細書で使用するように同じロック機構を監視します。 「ロック」の明細書とは対照的に、LockManager のオブジェクトのロックはロックの階層に完全に参加いるため、これらが正しい順序で使用されることを確認できます。
「ロック」のオブジェクトの 1 種類の特殊なケースは「ロック」リーフ オブジェクトです。 ここでは、このようなロックの詳細出力レベルなロックを指定する必要はありません-、入れ子になったロック常にであることを理解し、これらのリーフのロックすると、他のロックは使用できません。
「ロック」は名前付き動的にそれぞれの一意の名前のロック オブジェクトを割り当て、グローバルなディクショナリに格納することによって実装されます。 したがって、名前付きアクセス名前でロックをディクショナリ検索が対応するロック オブジェクトを検索する必要があります。 このような検索を実行中に、自体がロックされている場合、ロック オブジェクトのディクショナリ。 これはすべて名前付きロックをディクショナリ、およびディクショナリ検索をロックする追加の料金は、通常のロックよりも、高いします。 ここでは、このようなコストを削減するために、2 種類の方法を使用します: (1) ディクショナリのグローバル ロックの競合を減らすため、ロック オブジェクトのディクショナリを、パーティション分割、(2) 呼び出し元を名前付きロック オブジェクトの参照をキャッシュし、ディクショナリ検索ほとんどの場合、省略する機能を提供します。 広スコープ ロックの多くのとを比較的には役に立たないため、単独でパーティション分割がデータベースのロックなど、十分であることに注意してください; たとえば、全員が同じ共有ロックをドラッグする場合。
一意のロックの名前の場合には無制限があります。 したがって、には、作成できます名前付きロック オブジェクトの数は、無限です。 名前付きロック オブジェクトへの参照がグローバルなディクショナリに格納されるため、このようなオブジェクトは、自動的によって収集できません。 そのために、定期的に使用されていない名前付きロック オブジェクトをクリーンアップするようにする場合。 名前付きロック オブジェクトのスレッド セーフなクリーンアップをサポートするには、このようなオブジェクトは refcounted。 名前付きロック オブジェクトで実行されるすべてのロックは、ロックが解放された後、このようなオブジェクトをの「」も参照 addrefed らを解放する必要があります。 クリーンアップ ロジックは、オブジェクトがディクショナリことをから削除前に現在参照されていないことを確認します。 名前付きロック オブジェクトはディクショナリから削除した後、破棄されると見なされ、もう addrefed できません。 同じ名前をロックすると、次の時間ディクショナリに戻ると同じ名前の追加の新しい名前付きロック オブジェクトを割り当てることになります。 したがって、古い名前付きのロック オブジェクト参照を呼び出し元によってキャッシュするには、が適切です。これは、それをロックし、新しいロック オブジェクトを割り当てようとしたときにこのような古い参照が検出され、更新されます。
また、未使用のロック オブジェクトをクリーンアップするには、単純な時間ベースのヒューリスティックを使用します。 次に、N によって示されるロックのリリースでクリーンアップを実行するタイミングがある場合は調べて、ディクショナリを収集および最近使用されないすべての参照オブジェクトを呼び出します。これをチェックします。 これは、そのようなオブジェクトの Dispose、ディクショナリから参照を削除しようとします。 クリーンアップはディクショナリのパーティションごとにより、特定のパーティションのクリーンアップを実行する場合は、他のパーティションをロックする必要がないように、あります。
スレッド セーフ
この型のすべてのパブリック static (Visual Basic では Shared) メンバーは、スレッド セーフです。インスタンス メンバーの場合は、スレッド セーフであるとは限りません。