繁体   English   中英

.NET中的线程安全队列(列表)

[英]Thread safe queue (list) in .net

我需要创建要添加到Lucene索引中的项目的线程安全列表。

以下线程安全吗?

public sealed class IndexQueue
{
    static readonly IndexQueue instance = new IndexQueue();
    private List<string> items = new List<string>();

    private IndexQueue() { }

    public static IndexQueue Instance {
        get { return instance; }
    }

    private object padlock = new object();

    public void AddItem(string item) {
        lock (padlock) {
            items.Add(item);
        }
    }
}

即使从内部列表中获取物品,也需要锁定吗?

我们的想法是,然后将有一个单独的任务运行,以从索引队列中获取项目并将其添加到Lucene索引中。

谢谢本

您的实现似乎是线程安全的,尽管从items读取时需要锁定-如果存在并发的Add操作,则不能安全地读取。 如果您进行枚举,则还需要锁定该枚举,并且该枚举必须与枚举器一样长寿。

如果可以使用.net 4,我强烈建议您查看System.Collections.Concurrent命名空间。 它具有经过良好测试和性能良好的集合,这些集合是线程安全的,实际上是围绕多线程访问进行了优化的。

即使从内部列表中获取物品,也需要锁定吗?

进行修改时,List类不是线程安全的。 在以下情况下必须锁定:

  • 您可以使用来自多个线程的类的单个实例。
  • 修改从列表中读取时,列表的内容可以更改。

大概第一个是正确的,否则您不会问这个问题。 第二个显然是正确的,因为Add方法会修改列表。 所以,是的,您需要它。

当您在类中添加允许您读回项目的方法时,也需要锁定,并且重要的是,您必须使用 AddItem 相同的锁定对象。

是; 尽管检索并不是本质上不安全的操作,但是如果您也在写列表,则冒着在写中间进行检索的风险。

如果这将像传统队列一样操作,则尤其如此,其中检索实际上将从列表中删除检索到的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM