我经历了SyncHashtable
在.Net框架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;
}
}
}
谢谢维韦克