Lucene的并发处理规则非常简单。下面我们来看看:
-
任意数量的只读属性的IndexReader类都可以同时打开一个索引。无论这些Reader是否同时属于一个JVM,以及是否属于同一台计算机都无关紧要。但需要记住:在单个JVM内,利用资源和发挥效率的最好办法是用多线程共享单个IndexReader实例。例如,多个线程或进程并行搜索同一个索引。
-
对于一个索引来说,一次只能打开一个Writer。Lucene采用文件锁来提供保障。一旦建立IndexWriter对象,系统机会分配一个锁给它。该锁只有当IndexWriter对象被关闭时才会释放。注意如果你使用IndexReader对象来改变索引的话——比如修改norms或者删除文档。这时IndexReader对象会作为Writer使用:它必须在修改上述内容之前成功地获取Writer锁,并在被关闭时释放该锁。
-
IndexReader对象甚至可以在IndexWriter对象正在修改索引时打开。每个IndexReader对象将向索引展示自己被打开的时间点。该对象只有在IndexWriter对象提交修改或自己被重新打开后才能获知索引的修改情况。所以一个更好的选择时,在已经有IndexReader对象被打开的情况下,打开新的IndexReader时采用参数create=true:这样,新的IndexReader会持续检查索引的情况。
-
任意多个线程都可以共享一个IndexReader类或IndexWriter类。这些类不仅是线程安全的,而且是线程友好的,也就是说它们能够很好地扩展到新增线程。
正如所述,Lucene能很好地支持多线程或多虚拟机访问。开发者可以简易地使用Lucene