• ReentrantReadWriteLock读写锁


    代码:

    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    //写,原子独占
    class MyCache {
        private volatile Map<String, Object> map=new HashMap<>();
        //private Lock lock = new ReentrantLock();//写的时候一个线程,读的时候多个线程
        private ReentrantReadWriteLock rwLock=new ReentrantReadWriteLock();
    
        public void put(String key,Object value){
            rwLock.writeLock().lock();
            try {
                System.out.println(Thread.currentThread().getName()+"	 正在写入:"+key);
                try {
                    TimeUnit.MILLISECONDS.sleep(300);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                map.put(key,value);
                System.out.println(Thread.currentThread().getName()+"	 写入:"+key);
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                rwLock.writeLock().unlock();
            }
        }
    
        public void get(String key){
            rwLock.readLock().lock();
            try {
                System.out.println(Thread.currentThread().getName()+"	 正在读取:"+key);
                try {
                    TimeUnit.MILLISECONDS.sleep(300);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
                Object result=map.get(key);
                System.out.println(Thread.currentThread().getName()+"	 读取完成:"+result);
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                rwLock.readLock().unlock();
            }
        }
    }
    public class ReadWriteLockDemo {
        public static void main(String[] args) {
            MyCache myCache=new MyCache();
            for (int i=0;i<=5;i++){
                final int tempInt=i;
                new Thread(()->{
                    myCache.put(tempInt+"",tempInt+"");
                },String.valueOf(i)).start();
            }
            for(int i=1;i<=5;i++){
                final int tempInt=i;
                new Thread(()->{
                    myCache.get(tempInt+"");
                },String.valueOf(i)).start();
            }
        }
    }
    

      

  • 相关阅读:
    onpropertychange与onchange事件应用
    HttpWorkerRequest实现大文件上传asp.net
    JQuery中对option的添加、删除、取值
    "分析 EntityName 时出错"的解决方法
    asp.net断点续传
    直接在ASP.net中上传大文件的方法
    ASP.NET中文件上传下载方法集合
    asp.net .ashx文件使用Server.MapPath解决方法
    FF与IE下javascript计算屏幕尺寸
    处理顶点——为赛道创建顶点
  • 原文地址:https://www.cnblogs.com/sunliyuan/p/12500702.html
Copyright © 2020-2023  润新知