我正在讀一本書中的代碼清單,在果殼中的C#3,在線程中感到困惑。 在對應用服務器線程安全的話題,下面的代碼是作爲一個UserCache的例子:爲什麼在從字典中讀取時鎖定
static class UserCache
{
static Dictionary< int,User> _users = new Dictionary< int, User>();
internal static User GetUser(int id)
{
User u = null;
lock (_users) // Why lock this???
if (_users.TryGetValue(id, out u))
return u;
u = RetrieveUser(id); //Method to retrieve from databse
lock (_users) _users[id] = u; //Why lock this???
return u;
}
}
作者解釋了爲什麼RetrieveUser方法不是一把鎖,這是爲了避免鎖定的高速緩存更長的時間。
我很困惑,爲什麼要鎖定TryGetValue和字典的更新,因爲即使使用上面的字典正在更新兩次,如果2個線程同時調用相同的未檢索的ID。
通過鎖定字典讀取到了什麼?
非常感謝您的所有意見和見解。
謝謝!這就說得通了。我想實際上沒有辦法確實地證明它。我嘗試刪除鎖並通過創建新線程在循環中調用它幾次,在更改代碼之後,每個線程總是在讀取後寫入,但它工作正常。但是與大多數線程一樣,它爲我工作的事實並不意味着它會一直工作。乾杯! – eastender 2010-08-09 17:47:22
當Dictionary被單線程設置一次並且之後只能被多線程讀取時,還需要鎖定它嗎?可能不會,但另一個意見將是有用的 – Adassko 2016-05-04 08:29:12
不;多次讀取都很好。 – SLaks 2016-05-04 12:56:55