从多个线程向字典中添加新项

本文关键字:添加 新项 字典 线程 | 更新日期: 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。虽然这在您的情况下可能不可行