我需要为要添加到 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/