一、锁的种类和含义

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相关推荐

  1. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  2. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

  3. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  4. Java多线程之CAS缺点

    Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...

  5. Java多线程之CAS深入解析

    Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...

  6. Java多线程之volatile详解

    Java多线程之volatile详解 目录: 什么是volatile? JMM内存模型之可见性 volatile三大特性之一:保证可见性 volatile三大特性之二:不保证原子性 volatile三 ...

  7. Java多线程之Semaphore用法

    Java多线程之Semaphore用法 本文目录: Semaphore基本概念 Semaphore使用案例:3个停车位,6辆车去抢,走一辆,抢一个停车位. 1. Semaphore基本概念 在信号量上 ...

  8. Java多线程之CyclicBarrier用法

    Java多线程之CyclicBarrier用法 本文目录 CyclicBarrier的基本概念 CyclicBarrier的案例:集齐7颗龙珠就可以召唤神龙 1. CyclicBarrier的基本概念 ...

  9. Java多线程之CountDownLatch用法

    Java多线程之CountDownLatch用法 本文目录: CountDownLatch基本概念 CountDownLatch案例:6个同学陆续离开教室后班长才可以关门 CountDownLatch ...

最新文章

  1. CBC2020 第五届中国计算机学会生物信息学会议(The Fifth CCF Bioinformatics Conference,简称CBC 2020) 2020年10月16日-10月18日在哈尔滨
  2. (Spring)Spring的使用
  3. nn.BCELoss与nn.CrossEntropyLoss的区别
  4. 阿里巴巴java规范检查_阿里巴巴Java开发规范
  5. 【转】我的第一个Python小程序
  6. 清默网络linux班,linux笔记(26)grep
  7. OpenCV Stitching_detailed 详解
  8. fpga 开源264编码_更好的开源安全性,学习编码,开放式家庭设计等
  9. for update在mysql中使用
  10. 限量!“Java 成长笔记” Spring Boot/Sentinel/Nacos 高并发
  11. mysql字段是否存在_mysql怎么查询字段是否存在?
  12. android view 屏幕外,安卓如何让View往屏幕外隐藏?
  13. python网课哪个好-python网课学习笔记--4
  14. Atitit 第三方登录与sso单点登录 单点登录:       我们的单点登录系统,主要包含了登录验证,token校验 、注销、注册几大功能,单点登录系统提供了统一的登录和注册页面,提供了统一的
  15. 【水果识别】基于matlab GUI HSV+RGB水果分类【含Matlab源码 380期】
  16. KISSsoft03-2018F SP6,计算和重新分析机器零件
  17. 利用C Free3.5 本身获得自身注册码
  18. 安装Ubuntu的几十次坑的经验
  19. axis的xml转java的实际开发使用笔记
  20. 中国大学慕课公开课-《视听语言》-学习笔记-4

热门文章

  1. seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  2. curl命令的超时时间
  3. Unable to instantiate application
  4. 从零开始成为一名开源程序员,其实只需要九步!
  5. ssl *** 思科支持设备型号
  6. Aix netstat命令解析
  7. 为什么谐振时电抗为0_变频串联谐振试验装置的接线原理
  8. Git push file exceed GitHub's file size
  9. linux下ntp服务器搭建方法
  10. 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题...