缓存功能(简单的synchronized和使用读写锁)

使用synchronized:

class MyCache{
	private Map cache = new HashMap();
	public synchronized Object getObject(String key){
		//加上锁是为了避免多个线程在得到的value都为null时,都同时去访问数据库
		Object value=cache.get(key);
		if(value==null){
			value="aaaaa";//其实是从数据库中得到相关的记录
			cache.put(key, value);
		}
		return value;
	}
}
使用读写锁:

class MyCache1{
	private Map cache = new HashMap();
	private ReadWriteLock rwl = new ReentrantReadWriteLock();
	public Object getObject(String key){
		rwl.readLock().lock();
		Object value=cache.get(key);
		if(value==null){
			rwl.readLock().unlock();//必须首先解锁才能获取写锁
			rwl.writeLock().lock();
			if(value==null){//这里为什么还要判断,避免多个写锁被阻塞(因为只能有一个写锁是互斥的)的时候,重复对value进行赋值,从而访问数据库
				value="aaaaa";//其实是从数据库中得到相关的记录
				cache.put(key, value);
			}
			//对锁进行降级,把写锁降级为读锁
			rwl.readLock().lock();//重新获取读锁不放弃写锁
			rwl.writeLock().unlock();//写锁解除,读锁仍在
		}
		rwl.readLock().unlock();
		return value;
	}
}


你可能感兴趣的:(java多线程)