util.Concurrent-ReadWriteLock

使用ReadWriteLock模拟简单的缓存管理器

package thread.lock;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * readLock  与 readLock  不互斥
 * readLocak 与  writeLock 互斥
 * writeLock 与  writeLock 互斥
 */
public class CacheManager {
	
	private ReadWriteLock rwl = new ReentrantReadWriteLock();
	
	private Map<String,Object> cache = new HashMap<String,Object>();
	
	public Object getValue(String key) {
		return processCacheData(key);
	}
	
	protected Object processCacheData(String key) {
		rwl.readLock().lock();
		Object obj = null;
		try {
			obj = cache.get(key);
			if(obj==null) {
				//Release read lock before acquiring write lock
				rwl.readLock().unlock();
				rwl.writeLock().lock();
				//check again
				if(obj==null) {
					obj = "get obj from somewhere";
				}
				rwl.readLock().lock();
				rwl.writeLock().unlock();
			}
		} finally {
			rwl.readLock().unlock();
		}
		return obj;
	}
	
}

猜你喜欢

转载自just2learn.iteye.com/blog/2070727