ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的

ReadWriteLock 读取操作通常不会改变共享资源,但执行写入操作时,必须独占方式来获取锁。

对于读取操作占多数的数据结构。ReadWriteLock 能提供比独占锁更高的并发性。

而对于只读的数据结构,其中包含的不变性可以完全不需要考虑加锁操作

ReadWriteLock实际上是一种乐观锁。

对于一个线程来说,读取数据不需要线程安全,写数据需要线程安全。因此如果读操作也只能一次只有一个线程操作,那么性能就浪费了,为此有了读写锁。

正常的锁,一次只能有一个线程操作。

读写锁:分为读锁和写锁。

读锁:可以多个读线程并发持有,一次能够有n多线程同时执行。

写锁:跟普通锁一样,是独占的,一次只能有一个线程进行写操作。

这样可以提高并发效率。

使用场景:

  • 写写/读写 操作:需要互斥。
  • 读读操作:不需要互斥。

初始化:

ReadWriteLock lock = new ReentrantReadWriteLock();

读锁上锁:

lock.readLock().lock(); //上锁

写锁上锁:

lock.writeLock().lock();

代码:

package com.atguigu.juc;import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/** 1. ReadWriteLock : 读写锁* * 写写/读写 需要“互斥”* 读读 不需要互斥*/
public class TestReadWriteLock {public static void main(String[] args) {ReadWriteLockDemo rw = new ReadWriteLockDemo();new Thread(new Runnable() {@Overridepublic void run() {rw.set((int)(Math.random() * 101));}}, "Write:").start();for (int i = 0; i < 100; i++) {new Thread(new Runnable() {@Overridepublic void run() {rw.get();}}).start();}}
}class ReadWriteLockDemo{private int number = 0;private ReadWriteLock lock = new ReentrantReadWriteLock();//读public void get(){lock.readLock().lock(); //上锁try{System.out.println(Thread.currentThread().getName() + " : " + number);}finally{lock.readLock().unlock(); //释放锁
        }}//写public void set(int number){lock.writeLock().lock();try{System.out.println(Thread.currentThread().getName());this.number = number;}finally{lock.writeLock().unlock();}}
}

JUC-ReadWriteLock相关推荐

  1. JUC系列(八)| 读写锁-ReadWriteLock

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  2. 多线程与高并发(三):JUC包下新的同步机制:CAS,AtomicInteger,AtomicLong,ReentrantLock,CountDownLatch,ReadWriteLock等

    CAS CAS 是一种乐观锁,syncronized 是一种悲观锁 AtomicInteger AtomicInteger count = new AtomicInteger(0); /*synchr ...

  3. 面试高频——JUC并发工具包快速上手(超详细总结)

    目录 一.什么是JUC 二.基本知识 2.1.进程和线程 2.2.Java默认有两个进程 2.3.Java能够开启线程吗? 2.4.并发和并行 2.5.线程的状态 2.6.wait和sleep的区别 ...

  4. juc java_深入理解JUC(java.util.concurrent)

    Concurrent下的核心类 Executor:具有runnable任务的执行者 ExecutorService:一个线程池管理者,实现类有多种,能把runnable,callable提交到线程池中 ...

  5. 多线程总结-JUC中常用的工具类

    本文只记录JUC中较常用到的一些工具类,只是列举其常见的使用方法,至于其实现原理,此处不做说明. CountDownLatch 一个同步工具类,允许一个或多个线程一直等待,直到其他线程运行完成后再执行 ...

  6. 多线程基础与JUC进阶笔记

    文章目录 1.实现线程的几种方式 1.1.继承Thread类 1.2.实现Runnable接口 1.3.实现Callable接口 2.Lambda表达式 3.静态代理模式 4.synchronized ...

  7. JUC多线程:synchronized锁机制原理 与 Lock锁机制

    前言: 线程安全是并发编程中的重要关注点,造成线程安全问题的主要原因有两点,一是存在共享数据(也称临界资源),二是存在多条线程共同操作共享数据.因此为了解决这个问题,我们可能需要这样一个方案,当存在多 ...

  8. JUC学习笔记及拓展

    Java JUC 1 Java JUC简介 在 Java 5.0 提供了 java.util.concurrent (简称 JUC )包,在此包中增加了在并发编程中很常用 的实用工具类,用于定义类似于 ...

  9. Java并发编程—JUC的Lock锁

    一.Lock (JUC锁) JUC 锁位于java.util.concurrent.locks包下,为锁和等待条件提供一个框架,它不同于内置同步和监视器. CountDownLatch,CyclicB ...

  10. 浅谈Java锁,与JUC的常用类,集合安全类,常用辅助类,读写锁,阻塞队列,线程池,ForkJoin,volatile,单例模式不安全,CAS,各种锁

    浅谈JUC的常用类 JUC就是java.util.concurrent-包下的类 回顾多线程 Java默认有几个线程? 2 个 mian.GC Java 真的可以开启线程吗? 开不了,点击源码得知:本 ...

最新文章

  1. ubuntu16.04:成功解决ubuntu16.04 忘记root密码
  2. 企业SAP的二次开发管理之路
  3. 基于模块度的社团检测算法
  4. 大家一起做训练 第一场 A Next Test
  5. Microsoft Project学习系列(一)
  6. Qt编程之对QGraphicsItem点击右键弹出菜单
  7. RocketMQ类关系图之broker/store
  8. 【正点原子STM32连载】第一章 本书学习方法 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1
  9. 最新大数据资料合集.pdf
  10. 教程 参数设置_AI全自动剪辑软件安装教程,参数设置与使用注意事项
  11. 追逐自己的梦想----------辅助制作第二十四课:寻路call的分析
  12. 用 SpriteKit 做一个逃逸游戏 (2)
  13. Python制作微信小助手
  14. 《在职报考英语四六级须知》
  15. git 版本回退之关于git reset --hard 和 --soft区别
  16. python 图像格式转换文件夹下 jpg 转 bmp | 目录遍历
  17. 面试官常问的问题及回答
  18. Windows无法访问网络共享解决办法
  19. windows10 原版 纯净版 下载
  20. 网站建设基础-使用if和switch分别输出今天为周几

热门文章

  1. 算术运算符举例java_Java的算术运算符简介
  2. python在通信中的应用_基于Redis的进程间通信——在C++里使用python的深度学习模型...
  3. QuickLook搭配Everthing提高工作效率
  4. excel根据rgb自动填充颜色_Excel一键定位空值与自动填充
  5. 牛客java面试题总结版(三)
  6. 高考后家有学计算机,2021高考热门专业将有大改动,计算机专业永远的神,榜首才是真黑马...
  7. html js 添加数据类型,js数据类型判断和转换
  8. linux格式化分区进程,linux磁盘分区格式化
  9. ios13文件连接服务器教程,iOS 13/iPad OS迈向生产力的一大步,SMB文件共享视频图文教程...
  10. Spark详解(九):Spark存储原理分析