如果我有一個ConcurrentDictionary並在if語句中使用TryGetValue,這是否會使if語句的內容線程安全?還是必須鎖定在if語句中?在if語句中使用ConcurrentDictionary TryGetValue是否使if內容線程安全?
例子:
ConcurrentDictionary<Guid, Client> m_Clients;
Client client;
//Does this if make the contents within it thread-safe?
if (m_Clients.TryGetValue(clientGUID, out client))
{
//Users is a list.
client.Users.Add(item);
}
或做我必須做的:
ConcurrentDictionary<Guid, Client> m_Clients;
Client client;
//Does this if make the contents within it thread-safe?
if (m_Clients.TryGetValue(clientGUID, out client))
{
lock (client)
{
//Users is a list.
client.Users.Add(item);
}
}
'TryGetValue'本身是線程安全的...它不會使'if語句線程安全......在示例中,您的節目需要'鎖定'。 – Yahia
感謝您解決這個問題。我見過一堆使用像這樣的對象進行鎖定的示例:private readonly object m_lock = new object(); 。我可以鎖定我的方式,還是應該使用對象進行鎖定? – Mausimo
這取決於你想實現的目標 - 如果你想確保客戶端的實例只能被一個線程修改,那麼就使用你當前的方法......另一種方法可以被實現,甚至可以在全局序列化變化,例如... – Yahia