面试题:用读写锁写一个缓存

private Map cache = new HashMap();
private ReadWriteLock rwl = new ReentrantReadWriteLock();
public Object getData(String key) {
	rwl.readLock().lock();
	Object value = null;
	try {
		value = cache.get(key);
		//value为空再去写
		if(value == null) {
			//读锁先解锁
			rwl.readLock().unlock();
			//再上写锁,多个线程时,第一个线程先加锁,其他的先等待
			rwl.writeLock().lock();
			try {
				//如果多个线程进来,第一个线程先执行,执行完之后value不为null,所以这里
				//判断一次是为了后面的线程来执行时不用再去写。
				if(value == null) {
					value = "aaaa";//实际是去queryDB();
				}
			}finally {
				//写完释放写锁
				rwl.writeLock().unlock();
			}
			//再上读锁
			rwl.readLock().lock();
		}
	} finally {
		//读锁解锁
		rwl.readLock().unlock();
	}
	return value;
}

 

你可能感兴趣的:(面试题:用读写锁写一个缓存)