public class CacheDemo {
private Map<String,Object> cache = new HashMap<String,Object>(50);
public static void main(String[] args) {
}
/*
* 多个线程的并发执行,保证数据正确
* */
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";// 这是从数据库中取得值
}
}finally {
rwl.writeLock().unlock(); // 第一个线程释放写锁
}
rwl.readLock().lock(); // 进而去读。其他线程开始加写锁,最后也会被释放
}
}finally {
rwl.readLock().unlock();
}
return value;
}
}
要实现一个缓存并不是那么容易的,要考虑很多种情况