我正在使用并发字典的GetOrAdd方法来检索值列表,然后引用我正在编辑它们的值列表。以这种方式进行线程安全吗?
我正在添加一个值的第一种方法和我正在清除列表的第二种方法。
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Threading.Tasks;
using Test.Web.Services;
namespace Test.Web.Messaging
{
public class Dispatch
{
private static readonly ConcurrentDictionary<string, IList<Message>> Messages = new ConcurrentDictionary<string, IList<Message>>();
public static void AddMessage(string id, Message value)
{
var msgs = Messages.GetOrAdd(id, new List<Message>());
msgs.Add(value);
}
public static void Send(string id)
{
var msgs = Messages.GetOrAdd(id, new List<Message>());
foreach (var msg in msgs)
{
Connection.Send(id, msg);
}
msgs.Clear();
}
}
}
答案 0 :(得分:14)
字典不保存存储的值。它管理的唯一事情是确保键到值的映射保持一致。您仍然需要使用适当的锁定来保护存储的对象的数据。
答案 1 :(得分:7)
ConcurrentDictionary
使value
对象线程的获取和添加安全。一旦获得value
对象,多个线程访问或更改同一object
的属性就不是线程安全的。