Lucene学习笔记:并发、线程安全及锁机制

  • 任意数量的只读属性的IndexWriter类都可以同时打开一个索引。无论这些Reader是否属于同一个JVM,以及是否属于同一台计算机都无关紧要。但需要记住:在单个JVM内,利用资源和发挥效率的最好办法是用多线程共享单个的IndexReader实例。例如,多个线程或进程并行搜索同一个索引。

  • 对于一个索引来说,一次只能打开一个Writer。Lucene采用文件锁来提供保障。一旦建立起IndexWriter对象,系统即会分配一个锁给他。该锁只有当IndexWriter对象被关闭时才会释放。注意如果你使用IndexReader对象来改变索引的话,IndexReader会作为Writer使用:必须在修改上述内容之前成功地获取Writer锁,并在被关闭时释放该锁。

  • IndexReader对象甚至可以在IndexWriter对象正在修改索引时打开。每个IndexReader对象将向索引展示自己被打开的时间点。该对象只有在IndexWriter对象提交修改或自己被重新打开后才能获知索引的修改情况。所以一个更好的选择是,在已经有IndexReader对象被打开的情况下,打开新IndexReader时采用参数create=true。这样,新的IndexReader会持续检查索引的情况。

  • 任意多个线程都可以共享同一个IndexReader类或IndexWriter类。这些类不仅是线程安全的,而且是线程友好的,即是说它们能够很好地扩展到新增线程(假定你的硬件支持并发访问,因为这些类中标识为同步的代码数并不多,仅为最小值)。

你可能感兴趣的:(Lucene学习笔记:并发、线程安全及锁机制)