`
bjxagu
  • 浏览: 165361 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

多线程操作建议

阅读更多

对于并发,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中的线程管理以及如何在实践中有效利用。 Android系统默认运行在主线程,也被称为UI线程,...

    演示PB如何实现多线程

    在PowerBuilder(PB)开发环境中,多线程技术是一种关键特性,它允许应用程序同时执行多个独立的任务,提高程序的响应性和效率。本示例通过"thread.pbl"和"testthread.pbl"两个对象,展示了如何在PB中实现多线程。 ...

    java多线程分页查询

    ### Java多线程分页查询知识点详解 #### 一、背景与需求分析 在实际的软件开发过程中,尤其是在处理大量数据时,如何高效地进行数据查询成为了一个关键问题。例如,在一个用户众多的社交平台上,当用户需要查看...

    多线程编程指南

    多线程编程是一种让多个代码路径在同一个程序中同时运行的技术,它允许多个执行流(线程)并发执行。在iOS开发中,多线程编程可以帮助开发者充分利用多核处理器的性能,提高应用程序的响应性和运行效率。然而,多...

    C++多线程 最简易的多线程程序

    在标签“建议模拟多线程”中,可能是指通过模拟并发情况来学习多线程。这可以通过编写多个简单的线程函数,观察它们如何相互交互和竞争资源来实现。 在实际开发中,多线程应用可能会涉及到更复杂的问题,如死锁、...

    Linux多线程编程手册

    Linux多线程编程是计算机编程中一个高级主题,涉及到...手册中不仅详细介绍了多线程编程的理论知识,还包括了大量编程示例和最佳实践建议,对于任何希望精通Linux多线程编程的开发者来说,都是一份不可多得的参考资料。

    VS2015多线程

    【标题】"VS2015多线程" 涉及的知识点主要集中在C++编程语言中的多线程技术,以及如何在Visual Studio 2015开发环境中使用这些功能。多线程是现代软件开发中一个重要的概念,它允许程序同时执行多个任务,从而提高...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例).rar

    C#.NET多线程是.NET框架中用于实现并发执行任务的关键技术。在现代软件开发中,多线程已经成为提升程序性能、改善用户体验的重要手段。这个压缩包包含六个C#.NET多线程的实例,涵盖了多线程的基本使用以及互斥等高级...

    多线程开发及其源代码

    在IT行业中,多线程开发是一项至关重要的技术,特别是在当今的高性能计算和实时系统中。多线程允许程序同时执行多个任务,提高了系统的资源利用率和响应速度。本资源"多线程开发及其源代码"专注于教授如何进行多线程...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能的应用程序。本压缩包包含6个C#.NET多线程实例,涵盖了多线程的基本使用以及更复杂的互斥控制机制...

    WIN10_VS2019_配置_多线程_C语言.docx

    在Windows上开发,通常建议使用Windows API提供的多线程功能,以便更好地利用操作系统特性。同时,对于跨平台项目,可以考虑使用支持多种平台的多线程库,如Boost.Thread或者C++11标准库中的`std::thread`。

    POSIX多线程程序设计

    除此之外,书中还讨论了如何使用barrier、读/写锁、工作队列管理器等同步工具,并提供了大量实例和建议,帮助读者避免多线程编程中的错误和性能问题。 线程是实现某种功能的基本软件单元,与传统的进程相比,线程更...

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。

    JAVA-多线程 所有文件

    在Java编程语言中,多线程是程序设计中的一个重要概念,尤其在开发高效能和响应迅速的应用时。这个“JAVA-多线程 所有文件”压缩包很可能包含了一系列关于Java多线程学习的源代码示例和相关文档。下面我们将深入探讨...

    C++多线程编程入门

    5. **原子操作与内存顺序**:`std::atomic`提供原子操作,如原子读/写,确保多线程环境中的数据一致性。内存顺序(如seq-cst,release-acquire等)是并发编程中的重要概念,它规定了不同线程间操作的可见性和依赖...

    e语言几个简单多线程写法

    在Erlang中,多线程模型不是传统的操作系统线程,而是基于轻量级进程(Lightweight Processes, LWP,通常称为进程)。这些进程具有低开销,快速上下文切换,以及内置的通信机制,使得并发编程变得相对简单和可靠。 ...

Global site tag (gtag.js) - Google Analytics