A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 血马雄风 中级黑马   /  2015-8-24 08:44  /  180 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

技术要求:1、可以缓存多个实体数据
          2、当前缓存系统中不存在你需要的数据,让我去数据库中读取
          3、当前缓存系统中存在你你需要的数据,我就直接给你
          4、存在多个线程读取数据

技术要点:1、使用读写锁
          2、锁上ReadLock,从缓存系统中读取数据。若有,直接到5;若没有
          3、释放ReadLock,锁上WriteLock,从数据库中读取数据,并存到缓存
          4、释放WriteLock,锁上ReadLock
          5、释放ReadLock,返回数据



class CacheDemo{
    private Map<String,Object> cache = new HashMap<String,Object>();
    private ReadWriteLock rwR = new ReentrantReadWriteLock();
        
    public Object getData(String key){
        rwR.readLock().lock();
        Object value = null;
        try{
            value = cache.get(key);
            if(value == null){
                rwR.readLock().unlock();  //A处
                rwR.writeLock().lock();
                try{
                    if(value == null){  //该语句的作用:若存在3个线程同时到A处之后,禁止其它2个线程进行读取
                        value = ...;    //实际去queryDB
                        cache.put(key, value);
                    }
                }finally{
                    rwR.writeLock().unlock();
                }
                rwR.readLock().lock();
            }
        }finally{
            rwR.readLock().unlock();
        }
        
        return value;
    }  
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马