private ReadWriteLock rwl = new ReentrantReadWriteLock();
public Object getData(String key){rwl.readLock().lock();
Object value = null;
try{
value = cache.get(key);
if(value == null){
rwl.readLock().unlock();
rwl.writeLock().lock();
try{
if(value==null){
value = "aaaa";//实际失去queryDB();如果已经有数据,其他线程进来不必再写
}
}finally{
rwl.writeLock().unlock();
}
rwl.readLock().lock();
}
}finally{
rwl.readLock().unlock();
}
return value;
}
}
1.首先,一个线程进来读数据,先上读锁;//如果几个线程一起进来,让它们先阻塞,写好数据再释放读锁让它们读
2.如果没有数据,读锁解锁,上写锁;
3.解锁写锁;上锁读锁,解锁读锁;