Java多线程之ReentrantReadWriteLock
一、锁的种类和含义
Java的concurrent并发包中,存在两种类型的锁,即共享锁和排它锁,后者也叫做独占锁。
共享锁是指某一时刻锁可以被多个线程同时拥有,这些线程同时共享该锁。而排它锁则是指锁在某一时刻只能被一个线程拥有,任何想要获得该锁的线程,必须等待的锁的所有者释放后才可以。
二、ReentrantReadWriteLock的含义
ReentrantReadWriteLock是Java中的一种读写锁,它既不是完全的共享锁,也不是完全的排它锁。它实际上是一种混合形式的锁,既包含共享锁,同时也包含排它锁。
这么做是为了什么呢?我们知道,很多情况下有这样一种业务场景,即对于一块数据,或者一个对象,即存在需要读取的时候,也存在需要修改,即写入的时候。那么,如果对于这种应用场景,如果是只用共享锁,同一时刻,允许多个线程读取和写入数据,那么数据操作的原子性就无法得到保证,在多并发的情况下,数据往往就是紊乱的;如果是只用排它锁,即某一线程读取的时候,即不允许其它线程写入,也不允许其它线程读取,这样是能保证数据操作的原子性,得到正确的数据,那么性能也随之降低了。
所以,在兼顾数据操作的原子性和读写性能二者的情况下,一种同时融合共享锁和排它锁的混合锁的产生,就显得特别有意义了。这就是我们本文将要阐述的读写锁ReentrantReadWriteLock。
它在读取数据或对象的时候使用读锁,即一种对读共享同时读写排它的锁,允许多个线程同时读取数据,但是不允许其它线程修改数据;而在修改数据或对象时使用写锁,一种完全的排它锁,既不允许 其它线程读取数据,也不允许其他线程修改数据。这样,数据操作的原子性和性能同时得到了考虑。
三、ReentrantReadWriteLock的定义及实现
ReentrantReadWriteLock实现了Java中的ReadWriteLock接口。
四、ReentrantReadWriteLock的使用方式及代码示例
ReentrantReadWriteLock的使用方式如下:
首先,需要构造一个ReentrantReadWriteLock对象rrwl。代码如下:
// 构造ReentrantReadWriteLock对象rrwlprivate ReentrantReadWriteLock rrwl = new ReentrantReadWriteLock();
其次,需要获取ReentrantReadWriteLock对象rrwl的读锁readLock和写锁writeLock。代码如下:
// 获取读锁readLock:可被多个读线程共享,但是会排斥所有的写线程private Lock readLock = rrwl.readLock();// 获取写锁writeLock:排斥所有的读线程和其它写线程private Lock writeLock = rrwl.writeLock();
然后,读锁的使用方法如下:
// 读锁的使用public Object readObject() {Object object = null;// 利用读锁readLock获取读锁readLock.lock();try {// 此处为业务代码object = new Object();} finally {// 利用读锁readLock释放读锁readLock.unlock();}return object;}
最后,写锁的使用方法如下:
// 写锁的使用public void writeObject(Object object) {// 利用写锁writeLock获取写锁writeLock.lock();try {// 此处为业务代码} finally {// 利用写锁writeLock释放写锁writeLock.unlock();}}
Java多线程之ReentrantReadWriteLock相关推荐
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- Java多线程之Callable、Future和FutureTask
Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...
- Java多线程之Synchronized和Lock的区别
Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...
- Java多线程之CAS缺点
Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...
- Java多线程之CAS深入解析
Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...
- Java多线程之volatile详解
Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...
- Java多线程之Semaphore用法
Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...
- Java多线程之CyclicBarrier用法
Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...
- Java多线程之CountDownLatch用法
Java多线程之CountDownLatch用法 本文目录: CountDownLatch基本概念 CountDownLatch案例:6个同学陆续离开教室后班长才可以关门 CountDownLatch ...
最新文章
- CBC2020 第五届中国计算机学会生物信息学会议(The Fifth CCF Bioinformatics Conference,简称CBC 2020) 2020年10月16日-10月18日在哈尔滨
- (Spring)Spring的使用
- nn.BCELoss与nn.CrossEntropyLoss的区别
- 阿里巴巴java规范检查_阿里巴巴Java开发规范
- 【转】我的第一个Python小程序
- 清默网络linux班,linux笔记(26)grep
- OpenCV Stitching_detailed 详解
- fpga 开源264编码_更好的开源安全性,学习编码,开放式家庭设计等
- for update在mysql中使用
- 限量!“Java 成长笔记” Spring Boot/Sentinel/Nacos 高并发
- mysql字段是否存在_mysql怎么查询字段是否存在?
- android view 屏幕外,安卓如何让View往屏幕外隐藏?
- python网课哪个好-python网课学习笔记--4
- Atitit 第三方登录与sso单点登录 单点登录: 我们的单点登录系统,主要包含了登录验证,token校验 、注销、注册几大功能,单点登录系统提供了统一的登录和注册页面,提供了统一的
- 【水果识别】基于matlab GUI HSV+RGB水果分类【含Matlab源码 380期】
- KISSsoft03-2018F SP6,计算和重新分析机器零件
- 利用C Free3.5 本身获得自身注册码
- 安装Ubuntu的几十次坑的经验
- axis的xml转java的实际开发使用笔记
- 中国大学慕课公开课-《视听语言》-学习笔记-4
热门文章
- seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
- curl命令的超时时间
- Unable to instantiate application
- 从零开始成为一名开源程序员,其实只需要九步!
- ssl *** 思科支持设备型号
- Aix netstat命令解析
- 为什么谐振时电抗为0_变频串联谐振试验装置的接线原理
- Git push file exceed GitHub's file size
- linux下ntp服务器搭建方法
- 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题...