zoukankan      html  css  js  c++  java
  • 学习多线程2---缓存模拟

    单线程情况下的缓存模拟

       

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

      

  • 相关阅读:
    Python核心技术与实战——十四|Python中装饰器的使用
    Python核心技术与实战——十三|Python中参数传递机制
    GUI学习之三十四——QSS样式表
    数据分析思维(一):数据分析的三种核心思维
    python设计模式
    Docker架构
    云技术
    5G[generation]的知识收集
    计算机网络知识汇总---20191207
    odoo里面的read_group写法
  • 原文地址:https://www.cnblogs.com/hzmbbbb/p/4280268.html
Copyright © 2011-2022 走看看