ReadWriteLock,读写锁你真的会用吗?

news/2024/5/20 10:05:18 标签: 多线程, 并发编程, , juc, java

ReadWriteLock

基本介绍

  • 独占(写) 一次只能被一个线程占有
  • 共享(读) 多个线程可以同时占有

ReadWriteLock

  • 读-读 可以共存!
  • 读-写 不能共存!
  • 写-写 不能共存!
  • 可以多个线程同时读,但只能同时有一个线程去写!

在这里插入图片描述
简单代码实现:

举例说明:这里我们就用一个简单的读写缓存的例子来说明,分用读写和不用读写两种情况来对比

1.主方法

java">public class ReadWriteLockTest {

    public static void main(String[] args) {


        //无读写
        MyCache myCache = new MyCache();

        //有读写
       // MyCacheLock myCache= new MyCacheLock();

        //5个写的线程
        for (int i = 1; i <= 5 ; i++) {
            int finalI = i;
            new Thread(() -> {
              myCache.put(finalI +"",finalI+"");
            },String.valueOf(i)).start();
        }


        for (int i = 1; i <= 5 ; i++) {
            int finalI = i;
            new Thread(() -> {
                myCache.get(finalI +"");
            },String.valueOf(i)).start();
        }

    }
}

2.无读写

java">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()+"写入成功");
    }

    public void get(String key){
        System.out.println(Thread.currentThread().getName()+"正在读取"+key);
        Object o = map.get(key);
        System.out.println(Thread.currentThread().getName()+"读取成功");
    }
}

运行结果:

在这里插入图片描述
这里可以看到1在写入的时候,5插队了,后面已经全都乱了

3.有读写

java">class MyCacheLock{

    private volatile Map<String,Object> map = new HashMap<>();
    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()+"写入成功");
        } 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()+"读取成功");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            readWriteLock.readLock().unlock();
        }
    }

}

运行结果:
在这里插入图片描述
可以看到哈,写入的时候只能一个写完了,另一个才能开始写,而读就不存在,可以多个线程同时读!

读写不是很难,但是要会要知道要会用

这次的讨论就到这里,欢迎大家留言讨论!


http://www.niftyadmin.cn/n/1715659.html

相关文章

事务的隔离级别举例_一文彻底读懂MySQL事务的四大隔离级别

前言之前分析一个死锁问题&#xff0c;发现自己对数据库隔离级别理解还不够深入&#xff0c;所以趁着这几天假期&#xff0c;整理一下MySQL事务的四大隔离级别相关知识&#xff0c;希望对大家有帮助~事务什么是事务&#xff1f;事务&#xff0c;由一个有限的数据库操作序列构成…

全是干货---阻塞队列BlockingQueue+BlockingQueue四组API+同步队列SynchronousQueue

1.阻塞队列BlockingQueue 简单介绍&#xff1a; 其实呐&#xff0c;阻塞队列也不是什么比较新的东西&#xff0c;他也是collection下的一种&#xff0c;与set、list等是同一等级的 那什么情况下&#xff0c;在哪种场景下我们会使用到阻塞队列呢&#xff1f; *多线程并发处…

xbee模块和单片机_Arduino与xbee模块点灯实验心得

1.硬件&#xff1a;Seeeduino Stalker v3.0俩块&#xff0c;xbeeS1俩块&#xff0c;led一个&#xff0c;导线&#xff0c;电源&#xff0c;面包板软件&#xff1a;XCTU,Arduino1.8.22.xbee模块配置&#xff1a;恢复出场设置后主机xbee的 DH&#xff1a;1234&#xff0c;MY:5…

线程池3大方法、7大参数、4种拒绝策略

1.池化技术 程序的运行&#xff0c;本质&#xff1a;占用系统的资源&#xff01; &#xff08;优化资源的使用 > 池化技术&#xff09; 线程池、连接池、内存池、对象池///… 创建、销毁。十分浪费资源 池化技术&#xff1a;事先准备好一些资源&#xff0c;有人要用&…

android怎么操作才会出现anr_Android ANR的产生和解决办法

ANR (Application Not Responding 程序无响应)ANR定义&#xff1a;在Android上&#xff0c;如果你的应用程序有一段时间响应不够灵敏&#xff0c;系统会向用户显示一个对话框&#xff0c;这个对话框称作应用程序无响应(ANR&#xff1a;Application Not Responding)对话框。用户…

四大函数式接口以及Stream流式计算

经过近几年计算机行业的发展&#xff0c;新时代的程序员&#xff1a;lambda表达式、链式编程、函数式接口、Stream流式计算 1.函数式接口 函数式接口&#xff1a; 只有一个方法的接口 Runnable就是一个典型的例子 FunctionalInterface public interface Runnable {public a…

像素位移_EOS R5s要来了,很可能具备像素位移功能

一向以慢著称的佳能奋发图强&#xff0c;推新机的速度整个就是下饺子的节奏&#xff01;2020年一季度将推出EOS R5S&#xff01;一般佳能说到S就是高像素&#xff0c;R5S也不例外&#xff0c;不过像素高了视频功能就别太期待的了。1、像素全画幅 9000万像素2、像素位移功能可拍…

ForkJoin、普通方法、stream并行流计算对比

1.什么是ForkJoin? orkJoin 在 JDK 1.7 &#xff0c; 并行执行任务&#xff01;提高效率。大数据量&#xff01; 大数据&#xff1a;Map Reduce &#xff08;把大任务拆分为小任务&#xff09; 2.ForkJoin特点 工作窃取&#xff0c;这个里面维护的都是双端队列 3.ForkJoin结…