从列表中添加/删除特定项的最佳方法是什么?在多线程场景中

本文关键字:是什么 方法 多线程 最佳 添加 列表 删除 | 更新日期: 2023-09-27 18:13:52

我现在有一个场景,需要在多线程条件下添加和删除项

我正在做

lock(list)
{
    if(!list.Contains(item))
    {
        list.Add(Item);
    }
}

lock(list)
{
    if(list.Contains(item))
    {
        list.Remove(Item);
    }
}

但是我现在有一个非常大的问题与竞争条件。锁时间越来越长

我希望我可以使用ConcurrentBag,但它没有包含方法,所以我不能删除我想要删除的特定项。

我现在使用concurrentdictionary作为临时解决方案。但这绝对不是正确的做法。

所以我的问题是如何解决这个问题?对于这样的东西,有没有不加锁的实现?因为并发命名空间下的集合都不适合这个问题

从列表中添加/删除特定项的最佳方法是什么?在多线程场景中

您需要的是HashSet<T>的并发版本。ConcurrentBag<T>不是为了这个目的,它是为了支持高效的生产者-消费者场景。在框架中没有这样的集合。

你可以用ConcurrentDictionary<Item, Item>,就像你说的。但我同意你的看法,这不是一个理想的解决方案。

或者,您可以将使用List<T>的锁定代码替换为使用HashSet<T>的锁定代码。像Contains()Remove()这样的操作在大列表上可能很慢。但是它们在哈希集中应该是快速的,如果你的集合足够大,这将显著提高你的性能。

也有可能有一些第三方库包含像ConcurrentHashSet<T>这样的东西,但我不知道任何

为锁定控件创建一个无意义的对象:

object listLock = new object();
lock(listLock)
{
    if(!list.Contains(item))
    {
        list.Add(Item);
    }
}

我相信这通常是执行锁定的标准方法,因为您上面已经描述了这个问题。