具体来说,我正在使用lucene来执行全文搜索,并且在某些情况下索引文件可能已损坏或者尚未创建,此时我将删除该文件并将索引重写为所述文件。我的问题涉及在多线程Java程序中删除和重写文件的实际行为。
在删除和恢复IO文件时,同步是否会保护IO文件?换句话说,它会阻止对另一个线程的访问并尝试使用相同的方法并在其已经处于进程中时开始重写吗?
setDirectory方法需要在类中的任何其他方法工作之前运行(否则会抛出错误),那么我的同步设置如何保护我免受任何多线程故障的影响?
当另一个线程尝试使用setDirectory方法并且buildCompleteIndex方法已经在进行中时,线程是否只是等待它完成,然后检查路径是否存在将检查是否会通过并继续打开索引?
在lucene中,我必须在编写,删除或搜索索引时进行同步,还是可以同时完成这些任务?
public void setDirectory(int organizationId) throws IOException {
this.organizationId = organizationId;
File path = new File(INDEX_PATH + "/" + String.valueOf(organizationId));
//If path does not exist, create it and create new index for organization
synchronized(this) {
if(!path.exists()) {
path.mkdirs();
buildCompleteIndex(organizationId, false);
}
}
this.directory = FSDirectory.open(path); //Open directory
}
private void buildCompleteIndex(int organizationId, boolean rebuildDir) {
if(rebuildDir) {
File path = new File(INDEX_PATH + "/" + String.valueOf(organizationId));
try {
Utils.deleteDirectory(path);
} catch (IOException e) {
throw new LuceneIndexException("Error rebuilding index directory.", e);
}
path.mkdirs();
}
List<Tag> tagList = tagDAO.findAll(organizationId);
for(Tag tag : tagList) {
add(tag);
}
}