/** * * @描述: 設計一個緩存器 ReadLock提升性能. * @做者: Wnj . * @建立時間: 2017年5月16日 . * @版本: 1.0 . */ public class CacheDemo { private Map<String, Object> cache = new HashMap<String, Object>(); public static void main(String[] args) { } private ReadWriteLock rwl = new ReentrantReadWriteLock(); /** * 檢查是有對應key的數據,有則返回,沒有則從DB中查詢 * <功能詳細描述> * @param key * @return */ public Object getData(String key) { //上讀鎖 rwl.readLock().lock(); Object value = null; try { value = cache.get(key); if (value == null) { //發現要寫的時候,釋放讀鎖,不讓別人讀了 rwl.readLock().unlock(); //上寫鎖,當有三個線程,第一個線程lock以後,其它線程就鎖不了了,或者說等其它兩個讀(寫)的線程,讀(寫)完,lock才能鎖上去 rwl.writeLock().lock(); //第以前一個寫線程釋放後,第二個線程獲取寫lock,要從新判斷一下是否須要再寫(讀),具體可參考jdk文檔 try { if (value == null) { value = "aaaa";//查詢數據庫存 } } finally { //釋放寫鎖 rwl.writeLock().unlock(); } //還原成讀鎖 rwl.readLock().lock(); } } finally { rwl.readLock().unlock(); } return value; } }