快取功能(簡單的synchronized和使用讀寫鎖)
阿新 • • 發佈:2019-02-12
使用synchronized:
使用讀寫鎖:class MyCache{ private Map<String,Object> cache = new HashMap<String,Object>(); public synchronized Object getObject(String key){ //加上鎖是為了避免多個執行緒在得到的value都為null時,都同時去訪問資料庫 Object value=cache.get(key); if(value==null){ value="aaaaa";//其實是從資料庫中得到相關的記錄 cache.put(key, value); } return value; } }
class MyCache1{ private Map<String,Object> cache = new HashMap<String,Object>(); private ReadWriteLock rwl = new ReentrantReadWriteLock(); public Object getObject(String key){ rwl.readLock().lock(); Object value=cache.get(key); if(value==null){ rwl.readLock().unlock();//必須首先解鎖才能獲取寫鎖 rwl.writeLock().lock(); if(value==null){//這裡為什麼還要判斷,避免多個寫鎖被阻塞(因為只能有一個寫鎖是互斥的)的時候,重複對value進行賦值,從而訪問資料庫 value="aaaaa";//其實是從資料庫中得到相關的記錄 cache.put(key, value); } //對鎖進行降級,把寫鎖降級為讀鎖 rwl.readLock().lock();//重新獲取讀鎖不放棄寫鎖 rwl.writeLock().unlock();//寫鎖解除,讀鎖仍在 } rwl.readLock().unlock(); return value; } }