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

标签 c# multithreading thread-safety lucene.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时也需要锁定——如果有并发的,你就不能安全地读取添加操作。如果你曾经枚举过,你也需要锁定它,并且它需要和枚举器一样长。

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

关于c# - .net 中的线程安全队列(列表),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3979014/

相关文章:

c++ - 在 C++ 中使用线程

java - 在 Tomcat 9 上运行的多线程服务器

java - runOnUiThread 方法和 Handler 有什么区别?哪一个最好用?

c# - 如何创建一个对象的实例?

c# - 列表框更新,焦点位于列表框中的最后一行

c# - 如何以编程方式告诉 Windows 任务栏打开(或关闭)给定的工具栏?

c# - 从文本文件中删除第一行并将其余单词放入与空格分隔的数组中,

python - 如何在多处理进程中保护日志记录对象免受垃圾收集器的影响?

ios - 使用 Grand Central Dispatch (GCD) 时获取 OSSpinLockLock

objective-c - 在后台线程上搜索