Lucene 鼓励从多个线程中重用 IndexWriter。
假设两个线程可能有一个对 IndexWriter 的引用,如果线程 A 调用 writer 上的 close,线程 B 将留下一个无用的 writer。但据我所知,lucene 以某种方式知道另一个线程使用同一个编写器并推迟其关闭。
真的是这样吗? Lucene 如何跟踪另一个线程使用编写器?
编辑 从答案来看关闭IndexWriter是不正确的。但这带来了一个新问题:如果保持 IndexWriter 打开,基本上会阻止从另一个 JVM 访问该索引(例如,在集群的情况下,或许多应用程序之间的共享索引)。
最佳答案
如果一个线程关闭了 IndexWriter 而其他线程仍在使用它,您将得到不可预知的结果。我们尝试让其他线程命中 AlreadyClosedException,但这只是尽力而为(不保证)。 EG,您也可以轻松命中 NullPointerException。因此,您必须进行外部同步以确保您不会这样做。
最近(目前仅在 Lucene 的主干中,最终成为 4.0)修复了 IndexWriter 中的一个大线程瓶颈,允许段刷新并发运行(以前它们是单线程的)。在并发硬件上运行有多个索引线程的应用程序上,这可以大大提高索引吞吐量。参见 http://blog.mikemccandless.com/2011/05/265-indexing-speedup-with-lucenes.html了解详情。
关于java - Lucene IndexWriter线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5899777/