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操作完成");
        }
        
    }

    结果如下:会一直阻塞。

  • 相关阅读:
    关于url路径的定义方式
    script标签的位置
    jQuery中ready与load事件的区别
    Python中cv2库和matplotlib库色彩空间排布不一致
    OpenCV for Python 学习笔记 三
    OpenCV for Python 学习笔记 二
    OpenCV for Python 学习笔记 一
    CentOS7配置opencv for python && eclipse c/c++[更新]
    <转>关于 error LNK2019:无法解析的外部符号 ,该符号在函数**中被引用的思考
    OpenCV load 运行出错 cv::Exception 出错
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/15028332.html
Copyright © 2011-2022 走看看