【发布时间】:2011-04-28 02:22:59
【问题描述】:
我需要创建要添加到 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);
}
}
}
即使从内部列表中获取项目也需要锁定吗?
我们的想法是,然后我们将运行一个单独的任务来从 indexqueue 中获取项目并将它们添加到 lucene 索引中。
谢谢 本
【问题讨论】:
-
.NET 4 中有线程安全的实现(如果您甚至可以使用 4),不确定您是否知道,因为我看到您正在滚动自己...msdn.microsoft.com/en-us/library/…
-
谢谢大家。将看看 System.Collections.Concurrent
-
我不认为
System.Collections.Concurrent对你有用。没有List等效项,即使有,您仍可能需要应用自己的锁定以使项的枚举成为原子的。这实际上取决于您希望枚举如何被多个线程感知。 -
Brian - ConcurrentQueue 正是我们所需要的。它的先进先出行为对我们有用。但是,正如您所说的那样,我们确实需要在对 Contains
的调用周围引入锁,以防止将重复项添加到队列中 - 只是为了防止发生竞争条件。
标签: c# multithreading thread-safety lucene.net