zoukankan      html  css  js  c++  java
  • 多线程-读写锁

    1.读写锁:一个资源可以被多个读线程访问,或者可以被一个写线程访问,但是不能同时存在读写线程,读写互斥,读读共享的。

    代码如下:

    class MyCache {
        private volatile Map<String,Object> map = new HashMap<>();
        private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
    
        //放数据
        public void put(String key, Object value) {
    
            try {
                rwLock.writeLock().lock();
                System.out.println(Thread.currentThread().getName() +" 正在写操作" + key);
                TimeUnit.MICROSECONDS.sleep(300);
                map.put(key,value);
                System.out.println(Thread.currentThread().getName() +" 写完了" + key);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                rwLock.writeLock().unlock();
            }
    
        }
    
        //取数据
        public Object get(String key) {
            Object result = null;
            try {
                rwLock.readLock().lock();
                System.out.println(Thread.currentThread().getName() +" 正在读取操作" + key);
                TimeUnit.MICROSECONDS.sleep(300);
                result = map.get(key);
                System.out.println(Thread.currentThread().getName() +" 取完了" + key);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                rwLock.readLock().unlock();
            }
    
    
            return result;
        }
    }
    
    public class ReadWriteLockDemo {
    
        public static void main(String[] args) throws InterruptedException {
            MyCache myCache = new MyCache();
            //创建线程放数据
            for(int i = 0; i <= 5; i++) {
                final int num = i;
                new Thread(() -> {
                    myCache.put(num +"",num +"");
                },String.valueOf(i)).start();
            }
    
            //创建线程读数据
            for(int i = 0; i <= 5; i++) {
                final int num = i;
                new Thread(() -> {
                    myCache.get(num +"");
                },String.valueOf(i)).start();
            }
        }
    
    
    }

    结果如下:


     

     代码如下:

    public class ReadWriteLockDemo1 {
        public static void main(String[ ]args) {
            ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
            ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
            ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();
    
            //锁降级
            writeLock.lock();
            System.out.println("---开始write操作");
    
            readLock.lock();
            System.out.println("---开始read操作");
    
            writeLock.unlock();
            System.out.println("---write操作完成");
    
            readLock.unlock();
            System.out.println("---read操作完成");
        }
    
    }

    正常结果如下:


    异常代码如下:

    public class ReadWriteLockDemo1 {
        public static void main(String[ ]args) {
            ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
            ReentrantReadWriteLock.ReadLock readLock = rwLock.readLock();
            ReentrantReadWriteLock.WriteLock writeLock = rwLock.writeLock();
    
            //锁降级
    
            readLock.lock();
            System.out.println("---开始read操作");
    
            writeLock.lock();
            System.out.println("---开始write操作");
    
    
    //        writeLock.unlock();
    //        System.out.println("---write操作完成");
    //
    //        readLock.unlock();
    //        System.out.println("---read操作完成");
        }
        
    }

    结果如下:会一直阻塞。

  • 相关阅读:
    mongodb数据类型
    Pycharm2020.1 破解教程
    酱茄主题(资讯/社区WordPress主题)正式发布
    WordPress社区商城小程序“酱茄pro小程序”V1.7.8发布
    SpringBoot 的@Value注解真是太强了,谁用谁说爽!
    python3_String复习
    Core Data的简单实用
    git submodule
    区间修改主席树
    快速数论变换ntt
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/15028332.html
Copyright © 2011-2022 走看看