从列表中添加/删除特定项的最佳方法是什么?在多线程场景中
本文关键字:是什么 方法 多线程 最佳 添加 列表 删除 | 更新日期: 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);
}
}
我相信这通常是执行锁定的标准方法,因为您上面已经描述了这个问题。