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;
}
}