ReadWriteLock 接口详解

ReadWriteLock 接口详解

这是本人阅读ReadWriteLock接口源码的注释后,写出的一篇知识分享博客

读写锁的成分是什么?

  • 读锁 Lock readLock();
  • 只要没有写锁,读锁可以被多个线程同时拥有
  • 写锁 Lock writeLock();
  • 写锁是独占的

所有读写锁的实现,都必须保证:写锁的内存同步效果也应该适用于读操作,也就是说,一个获取读锁的线程 应该可以看到上一个写锁所做的所有更新

读写锁与互斥锁的优劣比较

  • 相比较于互斥锁,读写锁 在什么情况下 具有更高的性能呢?
  • 这取决于数据被读取的频率 ,读和写操作的持续时间,存取数据的冲突
  • 也可以说是,同时读写数据的线程的数量
  • 例如:一个集合的数据被初始化之后,就很少再修改,然而被频繁的查找,这就是一个读写锁的理想的使用情况。
  • 那什么时候不适合用读写锁呢?
  • 如果更新数据变得频繁,那么数据大部分时间被独占,使用读写锁 并发性几乎没有增加。
  • 此外,如果读操作花费的时间很短,那么读写锁实现 所造成的消耗(读写锁本质上比互斥锁更复杂)会主导执行成本,尤其是
    当读写锁的实现 仍然通过一小段代码序列化所有线程时。
  • 最终,只有分析和测量才能评价一个读写锁是否适合你的应用程序。

读写锁的实现必须要做的决策

  • 在一个写操作释放写锁时,同时有写操作和读操作在等待,确定授予读锁还是写锁。
  • 优先写操作较多,因为写操作一般是短的、不频繁的。
  • 优先读操作较少,因为如果读操作是频繁的、时间长的,会导致写操作的长时间等待
  • 当一个读操作是活跃的,写操作在等待时,一个读操作请求读锁,确定是否授予读锁。
  • 优先读操作会无限期的推迟写草所
  • 优先写操作会减少并发的可能性
  • 确定锁是否可重入
  • 一个拥有写锁的线程能否重复获取它?
  • 拥有写锁时,能否获取读锁?
  • 读锁可以再次获取吗?
  • 写锁可以降级为读锁,而不允许插入写操作吗?
  • 读锁可以升级为写锁,并优先于其他正在等待的读操作和写操作吗?

Original: https://www.cnblogs.com/classicltl/p/16212965.html
Author: classic123
Title: ReadWriteLock 接口详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570191/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • springboot 读取 yml 配置的几种方式

    前言:在springboot 项目中一般默认的配置文件是application.properties,但是实际项目中我们一般会使用application.yml 文件,下面就介绍一…

    Java 2023年6月16日
    082
  • 得体的注释,让我总能想起TA

    作为一个技术TL,在排查生产问题时,我经常要周转于各个工程里。系统和服务多起来后,要我了解每一段代码具体的来龙去脉逐渐几乎不可能了。 例如,今天,我要查一下调用某个三方接口所配置的…

    Java 2023年6月15日
    096
  • 动力节点-王妈妈Springboot教程(七)SpringBoot集成Dubbo

    *视频观看地址 7.1 看 SpringBoot继承Dubbo的文档 https://github.com/apache/dubbo-spring-boot-project/blo…

    Java 2023年6月7日
    085
  • 堆的基本储存

    目录 一、概念及其介绍 二、适用说明 三、结构图示 四、Java 实例代码 一、概念及其介绍 堆(Heap)是计算机科学中一类特殊的数据结构的统称。 堆通常是一个可以被看做一棵完全…

    Java 2023年6月5日
    0165
  • spring mvc通过客户端传值,controller获取Sort对象

    之前客户端需要根据需求按不同的排序方式查看数据,按照一种约定排序,比如1代表时间升序,2代表时间降序,3,4这种形式,然后后台根据这些值创建Sort对象。 后来发现完全多此一举,可…

    Java 2023年6月7日
    089
  • 字符串中实用的方法

    1、strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时则会将…

    Java 2023年5月29日
    092
  • java使用POI操作XWPFDocument 生成Word实战(一)

    注:我使用的word 2016功能简介:(1)使用jsoup解析html得到我用来生成word的文本(这个你们可以忽略)(2)生成word、设置页边距、设置页脚(页码),设置页码(…

    Java 2023年6月7日
    099
  • JVM学习笔记之垃圾收集器【五】

    垃圾收集器 HotSpot 包含的垃圾收集器 一、串行收集器 1.1、Serial 收集器 在 JDk1.3 之前是新生代收集的唯一选择 单线程,只会使用一个 CPU 去完成 垃圾…

    Java 2023年6月5日
    088
  • AOP代理模式

    代理模式:1.静态代理原理:创建一个代理类实现目标类的接口,在代理类中包含目标类的对象 案例: 1)需要创建一个接口 java;gutter:true; public interf…

    Java 2023年6月13日
    094
  • 教你win7系统手动导入注册表获取管理员权限

    想必大家都遇到过win7系统手动导入注册表获取管理员权限的问题吧,大多数朋友还不知道怎么处理固然处理起来也不难,然而还是有一些小伙伴不明白win7系统手动导入注册表获取管理员权限应…

    Java 2023年5月30日
    093
  • Java中带包(创建及引用)的类的编译与调试

    java源程序的编译大家都知道,也就是cmd中到源文件所在目录下javac .java即可,当程序中有 包声明还能简简单单的直接javac .java吗?答案当然是no,下面举个简…

    Java 2023年5月29日
    079
  • POSIX 线程清理函数

    控制清理函数的函数有两个,一个是 pthread_cleanup_push(), 用来把清理函数压入栈中,另一个是 pthread_cleanup_pop(), 用来把栈中的函数弹…

    Java 2023年5月30日
    075
  • nginx跨域问题

    今天遇到一个新的跨域问题,弄了大半天 问题描述 看到跨域问题首先想到的是nginx代理有没有配,于是找测试去查了nginx的配置,发现做了代理的,这下不知道该怎么办了。。。。 于是…

    Java 2023年5月30日
    081
  • 【K8S】K8S入门基础知识

    一、K8S基础知识 K8S是什么 K8S(Kubernetes)是⼀个容器集群管理系统,可以做容器集群的⾃动化部署,⾃动化扩缩容,维护等功能 为什么要用K8S 传统应⽤部署是通过将…

    Java 2023年6月8日
    093
  • 面试官:你说说一条更新SQL的执行过程?

    在上一篇《面试官:你说说一条查询SQL的执行过程?》中描述了Mysql的架构分层,通过解析器、优化器和执行引擎完成一条SQL查询的过程,那这一篇续上继续说明一条更新SQL的执行过程…

    Java 2023年6月13日
    079
  • scrapy框架之item与pipelines

    继续以起点小说为例子,我们要做的就是把对象存储到item(类似于一个字典)中,在通过pipelines持久化到txt文件中。之前我们在运行爬虫的后面加”-o 爬虫名称&…

    Java 2023年6月5日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球