Lucene 中的同步与线程安全

Concurrency, thread-safety, and locking issues
规则:
1、任何时候都可以对index进行读操作,包括在index做写操作的时候。也就是说搜索什么时候都可以进行
2、多线程操作单个IndexReader和IndexWriter实例的方法时是线程安全的。但多个实例就必须自己做同步操作。而且没有可能出现多个IndexWriter实例。
3、但IndexReader和IndexWriter之间的写操作也存在着冲突。IndexWriter在添加、优化和合并等写操作时会跟IndexReader的删除等写操作冲突。因为是跨对象的冲突,所以Lucene使用了文件锁(这里的文件锁是指用文件作为锁标记而不是把文件变成只读),文件存在即锁存在,文件名是通过index所在的目录的路径加密而成,所以每份index只有一个锁。正是由于使用了这样的锁模型,所以是跨进程(不单单是线程了哦)的锁。IndexWriter在实例化的时候得到锁(创建锁文件),close的时候释放锁,所以当创建完一个IndexWriter之后,根本不能创建第二个。IndexReader在第一次调用写操作方法的时候得到锁,close的时候释放锁,所以IndexReader理论上可以创建多个实例,但当一个IndexReader执行了写操作,其他的IndexReader就不能在执行写操作,且IndexWriter也无法创建,直到那个IndexReader关闭为止。
所以,当要调用IndexWriter的写操作方法之前,最好关闭所有的IndexReader,否则在以后调用IndexReader的写操作方法时,会报错(数据过时,因为Index已经被IndexWriter操作过),当然不关闭也不会影响IndexWriter的写操作。当要调用IndexReader的写操作方法之前,必须关闭IndexWriter,否则无法进行,因为IndexWriter在创建的时候已经获得了锁。
1、创建两个IndexWriter。结果:第二个IndexWriter不能创建
2、创建一个IndexReader,执行其写操作,创建IndexWriter。结果:IndexWriter不能创建
3、创建两个IndexReader,执行其中一个的写操作,再执行另外一个的写操作。结果:第二个写操作不能进行
4、创建IndexWriter和IndexReader,不关闭IndexReader,IndexWriter写操作,IndexReader写操作。结果:IndexWriter可以执行,
IndexReader写操作不能执行。
5、创建IndexWriter和IndexReader,不关闭IndexReader,IndexWriter写操作,关闭IndexWriter,IndexReader写操作。结果:IndexWriter
可以执行,IndexWriter正常关闭,IndexReader写操作不能执行,抛数据过期错误。
6、创建IndexWriter和IndexReader,不关闭IndexWriter,IndexReader写操作。IndexReader不能执行。

你可能感兴趣的:(多线程,thread,Lucene)