Lucene (3) 并发,线程安全和锁

Submitted by Lizhe on Fri, 12/22/2017 - 15:10

 

任意数量的只读属性的IndexReader类都可以同时打开同一个索引.

无论这些Reader是否属于同一个JVM, 以及是否属于同一台计算机都无关紧要.

但需要记住, 在单个JVM内, 利用资源和发挥效率的最好办法是用线程共享单个的IndexReader实例

 

对于一个索引来说, 一次只能打开一个Writer. Lucene采用文件锁来提供保障. 一旦建立起IndexWriter对象, 系统会立刻分配一个锁给它.

该锁只有当IndexWriter对象被关闭时才会释放.

注意如果你使用IndexReader对象来改变索引的话, 比如修改norms或者删除文档, 这时IndexReader对象会作为Writer使用, 它必须在修改上述内容之前成功地获取Write锁, 并在被关闭时释放该锁  

 

当IndexWriter对象已经打开一个索引时, 你可以同时直接使用IndexReader打开同一个索引.

每个IndexReader对象会得到一个对应时间点的索引"快照", IndexReader只有在IndexWriter提交修改 或者 IndexReader自己被重新打开后才能获知索引的修改情况