对于并发,Lucene.Net 遵循以下规则:
1. 允许任意多的读操作并发,即任意数量用户可同时对同一索引做检索操作。
2. 即便正在进行索引修改操作(索引优化、添加文档、删除文档),依然允许任意多的检索操作并发执行。
3. 不允许并发修改操作,也就是说同一时间只允许一个索引修改操作。
Lucene.Net 内部已经对多线程安全进行了处理,打开 IndexWrite.cs / IndexReade.csr 文件,会发现很多操作都使用了 lock 进行多线程同步锁定。只要遵循一定的规则,就可以在多线程环境下安全运行 Lucene.Net。
建议:
1. Directotry、Analyzer 都是多线程安全类型,只需建立一个 Singleton 对象即可。
2. 所有线程使用同一个 IndexModifier 对象进行索引修改操作。
3. IndexWriter/IndexReader/IndexModifier/IndexSearcher 最好使用同一个 Directory 对象,否则多线程并发读写时可能引发 FileNotFoundException。
IndexModifier 对象封装了 IndexWriter 和 IndexReader 的常用操作,其内部实现了多线程同步锁定。使用 IndexModifier 可避免同时使用 IndexWriter 和 IndexReader 时需要在多个对象之间进行同步的麻烦。等所有修改操作完成后,记住调用 Close() 方法关闭相关资源。并不是每次操作都需要调用 Optimize(),可以依据特定情况,定期执行优化操作。
--------
以下演示代码简单封装了一个 IndexModifier Signleton 类型,确保多线程使用同一个对象,且只能由最后一个多线程调用 Close 方法关闭。
代码不完善,仅供参考!需要做些修改才能应用于实际项目。
public class MyIndexModifier
{
private static Directory directory = new RAMDirectory();
private static Analyzer analyzer = new StandardAnalyzer();
private static IndexModifier modifier;
private static List<Thread> threadList = new List<Thread>();
private MyIndexModifier() { }
public static IndexModifier GetInstance()
{
lock (threadList)
{
if (modifier == null)
{
modifier = new IndexModifier(directory, analyzer, false);
modifier.SetMaxFieldLength(1000);
}
if (!threadList.Contains(Thread.CurrentThread))
threadList.Add(Thread.CurrentThread);
return modifier;
}
}
public static void Close()
{
lock (threadList)
{
if (threadList.Contains(Thread.CurrentThread))
threadList.Remove(Thread.CurrentThread);
if (threadList.Count == 0)
{
if (modifier != null)
{
modifier.Close();
modifier = null;
}
}
}
}
}
多线程测试代码
for (int i = 0; i < 100; i++)
{
new Thread(delegate()
{
IndexModifier writer = MyIndexModifier.GetInstance();
for (int x = 0; x < 10; x++)
{
Document doc = new Document();
doc.Add(Field.Text("a", "Hello, World!"));
writer.AddDocument(doc);
}
Console.WriteLine("{0}: {1}", Thread.CurrentThread.ManagedThreadId, writer.DocCount());
MyIndexModifier.Close(); // 注意不是调用 IndexModifier.Close() !
}).Start();
}
分享到:
相关推荐
标题"Android多线程操作"和描述"Android多线程开发实例,对使用多线程的用户有一定的参考价值!"暗示我们将深入探讨Android中的线程管理以及如何在实践中有效利用。 Android系统默认运行在主线程,也被称为UI线程,...
在PowerBuilder(PB)开发环境中,多线程技术是一种关键特性,它允许应用程序同时执行多个独立的任务,提高程序的响应性和效率。本示例通过"thread.pbl"和"testthread.pbl"两个对象,展示了如何在PB中实现多线程。 ...
### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...
多线程编程是一种让多个代码路径在同一个程序中同时运行的技术,它允许多个执行流(线程)并发执行。在iOS开发中,多线程编程可以帮助开发者充分利用多核处理器的性能,提高应用程序的响应性和运行效率。然而,多...
在标签“建议模拟多线程”中,可能是指通过模拟并发情况来学习多线程。这可以通过编写多个简单的线程函数,观察它们如何相互交互和竞争资源来实现。 在实际开发中,多线程应用可能会涉及到更复杂的问题,如死锁、...
Linux多线程编程是计算机编程中一个高级主题,涉及到...手册中不仅详细介绍了多线程编程的理论知识,还包括了大量编程示例和最佳实践建议,对于任何希望精通Linux多线程编程的开发者来说,都是一份不可多得的参考资料。
【标题】"VS2015多线程" 涉及的知识点主要集中在C++编程语言中的多线程技术,以及如何在Visual Studio 2015开发环境中使用这些功能。多线程是现代软件开发中一个重要的概念,它允许程序同时执行多个任务,从而提高...
C#.NET多线程是.NET框架中用于实现并发执行任务的关键技术。在现代软件开发中,多线程已经成为提升程序性能、改善用户体验的重要手段。这个压缩包包含六个C#.NET多线程的实例,涵盖了多线程的基本使用以及互斥等高级...
在IT行业中,多线程开发是一项至关重要的技术,特别是在当今的高性能计算和实时系统中。多线程允许程序同时执行多个任务,提高了系统的资源利用率和响应速度。本资源"多线程开发及其源代码"专注于教授如何进行多线程...
在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能的应用程序。本压缩包包含6个C#.NET多线程实例,涵盖了多线程的基本使用以及更复杂的互斥控制机制...
在Windows上开发,通常建议使用Windows API提供的多线程功能,以便更好地利用操作系统特性。同时,对于跨平台项目,可以考虑使用支持多种平台的多线程库,如Boost.Thread或者C++11标准库中的`std::thread`。
除此之外,书中还讨论了如何使用barrier、读/写锁、工作队列管理器等同步工具,并提供了大量实例和建议,帮助读者避免多线程编程中的错误和性能问题。 线程是实现某种功能的基本软件单元,与传统的进程相比,线程更...
在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。
在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能和响应迅速的应用时。这个“JAVA-多线程 所有文件”压缩包很可能包含了一系列关于Java多线程学习的源代码示例和相关文档。下面我们将深入探讨...
5. **原子操作与内存顺序**:`std::atomic`提供原子操作,如原子读/写,确保多线程环境中的数据一致性。内存顺序(如seq-cst,release-acquire等)是并发编程中的重要概念,它规定了不同线程间操作的可见性和依赖...
在Erlang中,多线程模型不是传统的操作系统线程,而是基于轻量级进程(Lightweight Processes, LWP,通常称为进程)。这些进程具有低开销,快速上下文切换,以及内置的通信机制,使得并发编程变得相对简单和可靠。 ...