我经历了在.Net框架BCL中定义的SyncHashtable
的实现。SyncHashtable this [对象键]不使用锁定
此课程提供对多个读者和作者的同步访问。
其中一种方法被实现为
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;
}
}
}
由于这种方法 维韦克
我没有调用Hashtable线程安全;我重复了文档,因为它对于特定场景(多个读者和一个作者)是线程安全的。这反过来使得SyncHashtable线程安全无需锁定读取。 – Sven 2011-06-05 07:59:37
我只是想用不同的方式来表达,现在我认为这可能是没有必要的。我删除了原来的评论。 – 2011-06-05 08:04:59