天天看點

Java多線程進一步的了解之------------緩存機制

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