Я прошел реализацию SyncHashtable
в определенной в .Net Framework BCL.
Этот класс обеспечивает синхронизированный доступ для нескольких читателей и писателей.
Один из методов реализован как
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;
}
}
}
Спасибо Vivek