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

Ben*_*ter 13 c# multithreading lucene.net thread-safety

我需要创建一个线程安全的项目列表,以添加到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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

即使从内部列表中获取项目,是否还需要锁定?

我们的想法是,我们将运行一个单独的任务来从indexqueue中获取项目并将它们添加到lucene索引中.

谢谢Ben

Phi*_*eck 38

您的实现似乎是线程安全的,虽然您在读取时需要锁定items- 如果存在并发Add操作,则无法安全读取.如果你曾经枚举过,你也需要锁定它,并且只要枚举器就需要存活.

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