使用synchronized:
[java] view plain copy
class MyCache{
private Map<String,Object> cache = new HashMap<String,Object>();
public synchronized Object getObject(String key){
//加上锁是为了避免多个线程在得到的value都为null时,都同时去访问数据库
Object value=cache.get(key);
if(value==null){
value="aaaaa";//其实是从数据库中得到相关的记录
cache.put(key, value);
}
return value;
}
}
使用读写锁:
[java] view plain copy
class MyCache1{
private Map<String,Object> cache = new HashMap<String,Object>();
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;
}
}
华旅网络 |