单线程情况下的缓存模拟
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; } }
时间: 2024-10-29 19:05:53