辞書へのハッシュテーブル<> syncroot。
-
11-07-2019 - |
質問
ハッシュテーブルにはsyncrootプロパティがありますが、一般的な辞書にはありません。これを行うコードがある場合:
lock (hashtable.Syncroot)
{
....
}
ハッシュテーブルを削除して一般的な辞書に変更する場合、これをどのように複製しますか?
解決
互換性を厳しくしようとしているなら、ブライアンは正しい。これは、ディクショナリの上に現在のセマンティクスを維持する最良の方法です。
しかしそれを拡張します。 SyncRootプロパティが汎用ディクショナリに直接追加されなかった理由は、同期を行うための危険な方法だからです。 " lock(this)"より少しだけ良いこれは非常に危険であり、デッドロックが発生しやすくなります。これがなぜ悪いのかを説明するリンクをいくつか紹介します。
他のヒント
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.
}
var dictionary = new Dictionary<int, string>();
lock(((ICollection) dictionary).SyncRoot)
{
// ...
}
ハッシュテーブル/辞書が公開されていない場合は、辞書オブジェクト自体をロックするだけです。
所属していません StackOverflow