标签:
单线程情况下的缓存模拟
package com.test;
import java.util.HashMap;
import java.util.Map;
public class CachDemo {
private Map<String ,Object> cache = new HashMap<String,Object>();
public Object getData(String key){
Object value = cache.get(key);
if(value == null){
value = "aaaa";//去数据库查
}
return value;
}
}
多线程情况下用读写锁模拟缓存
读锁,加上后只能读,支持多线程并发
写锁,加上后可以修改变量,线程之间是互斥的
注:第二次检测value==null 有两个目的
检测堵塞在writeLock后唤醒继续执行的线程
在read锁释放,write锁加上的瞬间有可能有线程把value付了值
package com.test;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class CacheDemo {
private Map<String, Object> cache = new HashMap<String, Object>();
public static void main(String[] args) {
// TODO Auto-generated method stub
}
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{
//检测堵塞在writeLock后唤醒继续执行的线程
//在read锁释放,write锁加上的瞬间有可能有线程把value付了值
if(value==null){
value = "aaaa";//实际是去queryDB();
}
}finally{
rwl.writeLock().unlock();
}
rwl.readLock().lock();
}
}finally{
rwl.readLock().unlock();
}
return value;
}
}
标签:
原文地址:http://www.cnblogs.com/hzmbbbb/p/4280268.html