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;
}
}
要實作一個緩存并不是那麼容易的,要考慮很多種情況