从多个线程向字典中添加新项
本文关键字:添加 新项 字典 线程 | 更新日期: 2023-09-27 18:09:33
我有一个问题,添加一个新项目到静态字典,而从多个线程使用它。知道我哪里做错了吗?初始化字典:
public static class Server
{
public static volatile Dictionary<int, List<SomeClass>> Values;
}
尝试添加项目:
Server.Values.Add(someInt, new List<SomeClass> { elements});
正如Jon Skeet所解释的,你正在使用一个不能保证线程安全的对象
尝试使用ConcurrentDictionary
,它是为多线程并发场景设计的
public static class Server
{
public static ConcurrentDictionary<int, List<SomeClass>> Values =
new ConcurrentDictionary<int, List<SomeClass>>();
}
如何使用
bool added = Server.Values.TryAdd(someInt, new List<SomeClass> { elements});
一般来说,当处理在多个线程之间共享的资源时,您需要使用同步机制,例如lock()
,以使代码线程安全。创建一个公共对象作为锁使用:
private object _lock = new object();
然后包围所有访问共享资源的代码,像这样:
lock(_lock)
{
// perform operations on shared resource here.
}
需要注意的是,您应该为每个共享资源设置一个不同的锁,而不是为所有资源使用一个锁。如果您将锁对象与多个资源一起使用,那么您的代码可能非常低效。如果一个线程获取了锁,所以它可以使用资源A,那么其他线程将不得不等待锁被释放,即使它们想要访问与资源A无关的资源B。因此,每个资源最好有一个锁对象,并且为锁对象命名,这样你就知道应该与哪些资源一起使用。
另一种选择(如BRAHIM Kamel的答案所示)是使用替换,如果可用,为您的共享资源已经有线程同步,如ConcurrentDictionary
。虽然这在您的情况下可能不可行