12

ハッシュテーブルには syncroot プロパティがありますが、一般的な辞書にはありません。これを行うコードがある場合:

lock (hashtable.Syncroot)
{
....
}

ハッシュテーブルを削除して汎用辞書に変更する場合、これを複製するにはどうすればよいですか?

4

4 に答える 4

12

厳密に互換性を求めるなら、Bryan は正しいです。これは、ディクショナリの上に現在のセマンティクスを維持するための最良の方法です。

しかし、それを拡張します。SyncRoot プロパティがジェネリック ディクショナリに直接追加されなかった理由は、同期を行うのに危険な方法だからです。これは、非常に危険でデッドロックを起こしやすい "lock(this)" よりもわずかに優れています。これがなぜ悪いのかを説明するいくつかのリンクがあります。

于 2008-11-29T17:55:37.950 に答える
7

SyncRoot の背後にある新しい考え方は、元の設計に誤りがあったというものです。ロックするのがディクショナリだけで、それがプライベートである場合は、ディクショナリまたは同期オブジェクトとして機能する別のオブジェクトをロックできます。後者の手法は、保護している状態が辞書以上のものである場合に役立ちます。

// used as you would have used SyncRoot before
object _syncLock = new object();
Dictionary<string, int> numberMapper = new Dictionary<string, int>();

// in some method...
lock (_syncLock)
{
    // use the dictionary here.
}
于 2008-11-29T17:30:38.780 に答える
5
var dictionary = new Dictionary<int, string>();

lock(((ICollection) dictionary).SyncRoot)
{
    // ...
}
于 2008-11-29T16:15:24.530 に答える
3

ハッシュテーブル/辞書が公開されていない場合は、辞書オブジェクト自体をロックできます。

于 2008-11-29T16:17:37.367 に答える