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

本文详细阐述了在Lucene中同时打开多个只读属性的IndexWriter类的使用方法,强调了在单个JVM内利用多线程共享单个IndexReader实例的重要性。此外,文章还讨论了IndexReader在IndexWriter正在修改索引时的打开方式,以及如何通过参数create=true来持续检查索引情况。最后,强调了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类。这些类不仅是线程安全的,而且是线程友好的,即是说它们能够很好地扩展到新增线程(假定你的硬件支持并发访问,因为这些类中标识为同步的代码数并不多,仅为最小值)。

转载于:https://my.oschina.net/CuckooLong/blog/306501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值