我經歷了在.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