private Map<String,Object> cache = new HashMap<String,Object>();
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;
}