RAMDirectory类是与内存目录相关的,它和FSDirectory有很大地不同,这主要从它的构造函数来看:
public RAMDirectory() {
setLockFactory(new SingleInstanceLockFactory());
}
初始化的时候,指定的是LockFactory抽象类的一个具体实现类SingleInstanceLockFactory。SingleInstanceLockFactory类的特点是,所有的加锁操作必须通过该SingleInstanceLockFactory的一个实例而发生,也就是说,在进行加锁操作的时候,必须获取到这个SingleInstanceLockFactory的实例。
实际上,在获取到一个SingleInstanceLockFactory的实例后,那么对该目录Directory进行的所有的锁都已经获取到,这些锁都被存放到SingleInstanceLockFactory类定义的locks中。
因此,多个线程要进行加锁操作的时候,需要考虑同步问题。这主要是在获取SingleInstanceLockFactory中的SingleInstanceLock的时候,同步多个线程,包括请求加锁、释放锁,以及与此相关的共享变量。而SingleInstanceLockFactory类的定义也充分体现了这一点:
package org.apache.lucene.store;
import java.io.IOException;
import java.util.HashSet;
import java.util.Enumeration;
public class SingleInstanceLockFactory extends LockFactory {
private HashSet locks = new HashSet();
public Lock makeLock(String lockName) {
//从锁工厂中, 根据指定的锁lockName返回一个SingleInstanceLock实例
return new SingleInstanceLock(locks, lockName);
}
public void clearLock(String lockName) throws IOException {
synchronized(locks) { // 从SingleInstanceLockFactory中清除某个锁的时候,需要同步
if (locks.contains(lockName)) {
locks.remove(lockName);
}
}
}
};
class SingleInstanceLock extends Lock {
String lockName;
private HashSet locks;
public SingleInstanceLock(HashSet locks, String lockName) {
this.locks = locks;
this.lockName = lockName;
}
public boolean obtain() throws IOException {
synchronized(locks) { // 获取锁时需要同步
return locks.add(lockName);
}
}
public void release() {
synchronized(locks) { // 释放锁时需要同步
locks.remove(lockName);
}
}
public boolean isLocked() {
synchronized(locks) {
return locks.contains(lockName);
}
}
public String toString() {
return "SingleInstanceLock: " + lockName;
}
}
因为RAMDirectory是与内存相关的目录,所以它不是永久存在的,不像FSDirectory,所以实例化一个RAMDirectory可以从一个FSDirectory的实例来完成。如下:
public RAMDirectory(File dir) throws IOException {
this(FSDirectory.getDirectory(dir), true);
}
public RAMDirectory(String dir) throws IOException {
this(FSDirectory.getDirectory(dir), true);
}
RAMDirectory的这两个构造方法,就是根据一个FSDirectory进行初始化的,即在打开一个FSDirectory的时候,同时就有一个RAMDirectory被创建了。
为什么不直接操作FSDirectory呢?可以想到,执行I/O操作速度很慢的,而在内存中的RAMDirectory处理的效率会有很大的提高。
RAMDirectory的特点决定了,对目录Directory进行复杂的操作时,都要把这些操作转移到内存中来处理。通过拷贝目录的方式也可以实例化一个RAMdirectory,如下所示:
public RAMDirectory(Directory dir) throws IOException {
this(dir, false);
}
private RAMDirectory(Directory dir, boolean closeDir) throws IOException {
this();
Directory.copy(dir, this, closeDir);
}
将指定的dir目录拷贝到当前的内存中,即实例化一个RAMDirectory。这里,closeDir是一个很重要的状态变量,指定了拷贝完成后,源目录dir是否关闭。如果实例化一个RAMDirectory完成后就关闭源目录dir,可能会因为处理的时间非常短,而需要再次打开源目录dir,持久化到文件系统目录,开销可能会比直接操作源目录dir要大,这点要权衡。
另外,RAMDirectory类定义的成员中,有一个HashMap成员:
HashMap fileMap = new HashMap();
fileMap中存放了从源目录中取得的File,所以在RAMDirectory维护目录中文件的时候,都需要用到fileMap。
而且,管理RAMDirectory的时候,都需要synchronized。
转自:http://www.cnblogs.com/lvpei/articles/1731817.html
相关推荐
兼语句是文本知识中一种较为常见又比较特殊的句式,对兼语句进行知识获取方面的研究是文本知识获取的一个重要研究方向。为了构建一种新的兼语分类体系,从句中第一个谓词的角度出发将兼语句式分为八个大类,并在语义...
本次任务是一个较为复杂的新闻文本分类的任务,首先需要使用bert模型对新闻文本进行分类,然后使用Django构建一个文本分类结果查询的可视化系统。 我们的任务是要构建一个模型,任意输入一篇新闻文章,可以将新闻...
使用自编《特殊群体筛查问卷》从大学生中筛选出特殊群体,运用针对不同特殊群体的不同辅导方案,培养他们较为缺乏的人格品质。SCL-90前后测T检验发现,学习问题群体除了冲动因子其它因子分均比原来显著下降;经济困难...
一些较为特殊电阻的选用原则,欢迎下载 一些较为特殊电阻的选用原则,欢迎下载
这是简化的数据队列管理类,包含数据互锁,数据插入和获取
较为齐全的家装CAD图库较为齐全的家装CAD图库较为齐全的家装CAD图库较为齐全的家装CAD图库较为齐全的家装CAD图库较为齐全的家装CAD图库较为齐全的家装CAD图库较为齐全的家装CAD图库较为齐全的家装CAD图库较为齐全的...
基于目前科技发展水平和自然资源的差异,世界上许多产煤大国均有其煤炭分类标准,因而从标准类型、煤类术语和指标选择、指标定义等方面对国际上较为常见的标准进行了归类和对比。对比分析后发现:西方国家的分类标准在...
较为详细的光纤介绍 较为详细的光纤介绍
针对代价敏感思想在类不平衡问题中的传统代价给定方式,提出了分类性能需求引导代价优化的因子量化方法。...后者改善了负类严重误判情形,且正类召回率保持在0.5以上,分类性能达到较为均衡的状态。
作为汉语词汇系统中一类较为特殊的名词性结构,名量式复合词(Noun-Classifier Compound)在其结构模式和语义表达方面都显示出较为独特的特征。大量的语言事实表明,汉语名量式复合词的句法本质为限定词短语投射DP,其中...
源于基础测绘成果DLG(Digital Line Graphic,数字线划地图)产品中点类地图要素矢量数据集,OSM数据内容较为详细的系列数据,其矢量要素格式主要包括点要素、面要素及线要素。时间跨度为从2014年至2022年,时间序列...
基于多类支持向量机的多准则库存分类研究,肖智,王明恺,本文将多类支持向量机方法引入到多准则库存分类中,提出了一种可以较为准确地预测库存产品类别的方法。这种方法的优点是模型中的
hp的curl封装类用法,以实例形式较为详细的讲述了curl封装类及其使用方法,并总结了GET与POST的用法。 使用函数之前我们要需要把php curl模块打开(libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll) 开启...
层次分析法(Analytic Hierarchy Process,简称AHP)是对一些较为复杂、较为模糊的问题作出决策的简易方法,它特别适用于那些难于完全定量分析的问题。它是美国运筹学家T. L. Saaty 教授于70年代初期提出的一种简便...
较为详细的MUSIC算法原理及MATLAB实现.pdf 适合初学者了解算法的基本原理,并入手编写matlab程序!
较为全面的京东商城分类信息,在第三个库里有两个字符strcode字段,
银行行业点评报告:市场预期较为充分,对行业负面影响较为温和.pdf
开关电源可分为AC/DC和DC/DC两大类,DC/DC变换器现已实现模块化,且设计技术及生产工艺在国内外均已成熟和标准化,并已得到用户的认可,但AC/DC的模块化,因其自身的特性使得在模块化的进程中,遇到较为复杂的技术和...
食品饮料行业点评:预制菜市场快速发展,市场前景较为广阔.pdf