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

      

  • 相关阅读:
    mysql导sql脚本
    oracle导sql脚本
    基于jdk proxy的动态代理模式
    vue组件之组件的生命周期
    vue组件之组件间的通信
    python-爬虫scrapy框架安装及基本使用
    mongdb的使用
    python-爬虫 多线程爬虫
    python-爬虫 爬虫利器BeautifulSoup
    python-爬虫lxml库
  • 原文地址:https://www.cnblogs.com/hzmbbbb/p/4280268.html
Copyright © 2011-2022 走看看