java中BitCaskKeyDir的用法

这篇文章主要介绍“java中BitCaskKeyDir的用法”,在日常操作中,相信很多人在java中BitCaskKeyDir的用法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java中BitCaskKeyDir的用法”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

网站建设公司,为您提供网站建设,网站制作,网页设计及定制网站建设服务,专注于企业网站制作,高端网页制作,对广告制作等多个行业拥有丰富的网站建设经验的网站建设公司。专业网站设计,网站优化推广哪家好,专业成都网站营销优化,H5建站,响应式网站。

本文主要研究一下BitCaskKeyDir

BitCaskKeyDir

bitcask-java/src/main/java/com/trifork/bitcask/BitCaskKeyDir.java

public class BitCaskKeyDir {

	Map map = new HashMap();
	ReadWriteLock rwl = new ReentrantReadWriteLock();
	private boolean is_ready;

	public boolean put(ByteString key, BitCaskEntry ent) {

		Lock writeLock = rwl.writeLock();
		writeLock.lock();
		try {

			BitCaskEntry old = map.get(key);
			if (old == null) {
				map.put(key, ent);
				return true;
			} else if (ent.is_newer_than(old)) {
				map.put(key, ent);
				return true;
			} else {
				return false;
			}

		} finally {
			writeLock.unlock();
		}

	}
	
	public BitCaskEntry get(ByteString key) {
		
		Lock readLock = rwl.readLock();
		readLock.lock();
		try {
			
			return map.get(key);
			
		} finally {
			readLock.unlock();
		}
		
	}

	//......

}
  • BitCaskKeyDir提供了map来存放BitCaskEntry;其put方法使用writeLock.lock(),对于old值为null的或者新值大于old值的才put进去,否则返回false,最后writeLock.unlock();其get方法使用readLock.lock()从map读取指定key的值,最后readLock.unlock()

key_dirs

bitcask-java/src/main/java/com/trifork/bitcask/BitCaskKeyDir.java

public class BitCaskKeyDir {

	public static Map key_dirs = new HashMap();
	public static Lock keydir_lock = new ReentrantLock();
	
	public static BitCaskKeyDir keydir_new(File dirname, int openTimeoutSecs) throws IOException {
		
		File abs_name = dirname.getAbsoluteFile();
		BitCaskKeyDir dir;
		keydir_lock.lock();
		try {
			
			dir = key_dirs.get(abs_name);
			if (dir == null) {
				dir = new BitCaskKeyDir();
				key_dirs.put(abs_name, dir);
				return dir;
			}
			
			
		} finally {
			keydir_lock.unlock();
		}

		if (dir.wait_for_ready(openTimeoutSecs)) {
			return dir;
		} else {
			throw new IOException("timeout while waiting for keydir");
		}
	}

	public synchronized boolean is_ready() {
		return is_ready;
	}
	
	public synchronized void mark_ready() {
		is_ready = true;
		this.notifyAll();
	}
	
	public synchronized boolean wait_for_ready(int timeout_secs) {
		long now = System.currentTimeMillis();
		long abs_timeout = now + (timeout_secs * 1000);
		
		while (!is_ready && now < abs_timeout) {
			try {
				wait();
			} catch (InterruptedException e) {
				// ignore
			}
		
			now = System.currentTimeMillis();
		}
		
		return is_ready;
	}
}
  • BitCaskKeyDir定义了static的key_dirs,用于存放指定File的BitCaskKeyDir;其keydir_new会针对不存在的BitCaskKeyDir进行创建,最后通过dir.wait_for_ready(openTimeoutSecs)等待ready

小结

BitCaskKeyDir提供了map来存放BitCaskEntry;其put方法使用writeLock.lock(),对于old值为null的或者新值大于old值的才put进去,否则返回false,最后writeLock.unlock();其get方法使用readLock.lock()从map读取指定key的值,最后readLock.unlock()

到此,关于“java中BitCaskKeyDir的用法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


标题名称:java中BitCaskKeyDir的用法
分享链接:http://pwwzsj.com/article/pjegeo.html