zoukankan      html  css  js  c++  java
  • 读写锁

    读写锁

    image-20200803191025303

    public class ReadWriteLockDemo {
        public static void main(String[] args) {
    //        MyCache myCache = new MyCache();
            MyCacheLock myCache = new MyCacheLock();
    
            // 写入
            for (int i = 1; i <= 5 ; i++) {
                final int temp = i;
                new Thread(()->{
                    myCache.put(temp+"",temp+"");
                },String.valueOf(i)).start();
            }
    
            // 读取
            for (int i = 1; i <= 5 ; i++) {
                final int temp = i;
                new Thread(()->{
                    myCache.get(temp+"");
                },String.valueOf(i)).start();
            }
    
        }
    }
    
    // 加锁的
    class MyCacheLock{
    
        private volatile Map<String,Object> map = new HashMap<>();
        // 读写锁: 更加细粒度的控制
        private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    
        // 存,写入的时候,只希望同时只有一个线程写
        public void put(String key,Object value){
            readWriteLock.writeLock().lock();
            try {
                System.out.println(Thread.currentThread().getName()+"写入"+key);
                map.put(key,value);
                System.out.println(Thread.currentThread().getName()+"写入OK");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                readWriteLock.writeLock().unlock();
            }
        }
    
        // 取,读,所有人都可以读!
        public void get(String key){
            readWriteLock.readLock().lock();
            try {
                System.out.println(Thread.currentThread().getName()+"读取"+key);
                Object o = map.get(key);
                System.out.println(Thread.currentThread().getName()+"读取OK");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                readWriteLock.readLock().unlock();
            }
        }
    
    }
    
    /**
     * 自定义缓存
     */
    class MyCache{
    
        private volatile Map<String,Object> map = new HashMap<>();
    
        // 存,写
        public void put(String key,Object value){
            System.out.println(Thread.currentThread().getName()+"写入"+key);
            map.put(key,value);
            System.out.println(Thread.currentThread().getName()+"写入OK");
        }
    
        // 取,读
        public void get(String key){
            System.out.println(Thread.currentThread().getName()+"读取"+key);
            Object o = map.get(key);
            System.out.println(Thread.currentThread().getName()+"读取OK");
        }
    
    }
    

    视频参考https://www.bilibili.com/video/BV1B7411L7tE
    上一篇:JUC3大常用辅助类
    下一篇:阻塞队列

  • 相关阅读:
    GO开发[一]:golang语言初探
    Python带参数的装饰器
    Python函数篇
    19. logging模块
    18. json模块
    17. os模块
    16. sys模块
    15. random模块
    14. 模块-time模块
    29. java面向对象项目
  • 原文地址:https://www.cnblogs.com/junlinsky/p/13443290.html
Copyright © 2011-2022 走看看