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

    ReadWriteLock: 一个用于只读操作,一个用于写入操作;读的时候可以由多个线程进行,写的时候只能有一个。

    • 读-读:可以共存
    • 读-写:不可共存
    • 写-写:不可共存

    读锁:共享锁

    写锁:独享锁

    代码示例

    package pers.vincent.matrix.subject.readwrite;
    
    import java.util.HashMap;
    import java.util.Map;
    import java.util.concurrent.locks.ReadWriteLock;
    import java.util.concurrent.locks.ReentrantReadWriteLock;
    
    public class ReadWriteLockTest {
    
        public static void main(String[] args) {
            MyCache cache = new MyCache();
    
    
            for (int i = 1; i <=5 ; i++) {
                new Thread(()->{
                    cache.write();
                }).start();
            }
    
    
            for (int i = 1; i <=5 ; i++) {
                new Thread(()->{
                    cache.read();
                }).start();
            }
        }
    
    }
    
    class MyCache{
        private volatile Map<String, Object> map = new HashMap<String, Object>();
    
        private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    
        // 写入
        public void write(){
    
            try{
                readWriteLock.writeLock().lock();
    
                System.out.println(Thread.currentThread().getName()+"写入");
    
                map.put(Thread.currentThread().getName(), Thread.currentThread().getName());
    
                System.out.println(Thread.currentThread().getName()+"写入ok");
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                readWriteLock.writeLock().unlock();
            }
    
        }
    
        // 读取
        public void read(){
            try{
                readWriteLock.readLock().lock();
    
                System.out.println(Thread.currentThread().getName()+"读取");
    
                map.get(Thread.currentThread().getName());
    
                System.out.println(Thread.currentThread().getName()+"读取ok");
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                readWriteLock.readLock().unlock();
            }
    
        }
    
    }
    
  • 相关阅读:
    [转]数据类型和Json格式
    maven 配置阿里云仓库
    maven windows 环境变量
    jdk windows环境变量
    springcloud hystrix 部分参数整理
    springboot 解决 woff2、ttf 跨域无法解析问题
    centos7 mysql5.7 rpm 安装
    centos7.3 chrome 安装
    springboot 1.5.X junit测试
    centos7 配置ftp访问
  • 原文地址:https://www.cnblogs.com/blackBlog/p/13451469.html
Copyright © 2011-2022 走看看