1.多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥
package com.ronbay.thread.timer; import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * @author Ronbay * 一个面试题 缓存系统 * */ public class CacheDemo { private Map<String,Object> cache = new HashMap<String,Object>(); public static void main(String[] args) { String name = (String)new CacheDemo().getData("key"); System.out.println("name=" + name); } ReadWriteLock rwLock = new ReentrantReadWriteLock(); public Object getData(String key){ Object value = null; try { rwLock.readLock().lock(); //若缓存有数据直接返回 value = cache.get(key); //若缓存没有再查数据库,再返回 if(value == null){ rwLock.readLock().unlock(); rwLock.writeLock().lock(); try { if(value == null){ value="aaa"; //实际是去queryDB() } } catch (Exception e) { e.printStackTrace(); }finally{ rwLock.writeLock().unlock(); } //再加上读锁 rwLock.readLock().lock(); } } catch (Exception e) { e.printStackTrace(); }finally{ rwLock.readLock().unlock(); } return value; } }