SyncHashtable
in defined in .Net フレームワーク BCLの実装を行いました。
このクラスは、複数のリーダーとライターへの同期アクセスを提供します。
メソッドの1つは次のように実装されています
public override Object this[Object key] {
get {
return _table[key];
}
set {
lock(_table.SyncRoot) {
_table[key] = value;
}
}
}
私の意見では、オブジェクトにアクセスする前に get メソッドも Syncroot をロックする必要があります。
シナリオを考えてみましょう:
スレッド 1: からキーを削除していHashtable
ます。
スレッド 2 : キーを使用してオブジェクトを読み取る。
オブジェクトの読み取り中にスレッド 2 でコンテキスト スイッチが発生し、スレッド 1 がオブジェクトを削除すると、読み取り操作が失敗するか、一貫性のない結果が得られます。
したがって、このメソッドをこのように実装することはできませんでした
public override Object this[Object key] {
get {
lock(_table.SyncRoot)
{
return _table[key];
}
}
set {
lock(_table.SyncRoot) {
_table[key] = value;
}
}
}
ありがとう