【JAVA】谈谈 ReadWriteLock 和 StampedLock

🍎个人博客:个人主页

🏆个人专栏:JAVA

⛳️  功不唐捐,玉汝于成


目录

前言

正文

ReadWriteLock(读写锁)

基本原理:

接口和实现:

用法示例:

StampedLock(印戳锁)

基本原理:

接口和实现:

用法示例:

区别与适用场景:

性能差异:

功能差异:

适用场景:

结语

 我的其他博客


前言

在多线程编程中,对共享资源的读写操作是一个常见的挑战。Java并发包中提供了ReadWriteLockStampedLock两种灵活的锁机制,分别在不同场景下提供了高效的并发控制。深入理解它们的原理、用法以及适用场景,对于提高多线程应用的性能和可维护性至关重要。

正文

ReadWriteLockStampedLock 都是Java并发包(java.util.concurrent)中提供的用于支持读写操作的锁机制。它们分别在一些场景下提供了更高的并发性能和更灵活的功能。

ReadWriteLock(读写锁)

  1. 基本原理:
    • ReadWriteLock 允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这可以有效提高多线程环境下对共享资源的并发访问性能。
  2. 接口和实现:
    • ReadWriteLock 是一个接口,有两个主要的实现类:ReentrantReadWriteLockReadWriteLock
  3. 用法示例:
    ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    Lock readLock = lock.readLock();
    Lock writeLock = lock.writeLock();// 读操作
    readLock.lock();
    try {// 读取共享资源的操作
    } finally {readLock.unlock();
    }// 写操作
    writeLock.lock();
    try {// 写入共享资源的操作
    } finally {writeLock.unlock();
    }
    

StampedLock(印戳锁)

  1. 基本原理:
    • StampedLock 也支持读写锁的基本功能,但引入了“印戳”(stamp)的概念,用于标记锁的状态。不同于 ReadWriteLock 的是,StampedLock 提供了乐观读锁和悲观读锁两种读锁。
  2. 接口和实现:
    • StampedLock 是一个类,没有直接的接口。它提供了readLock()writeLock()等方法。
  3. 用法示例:
    StampedLock lock = new StampedLock();// 乐观读
    long stamp = lock.tryOptimisticRead();
    // 读取共享资源的操作
    if (!lock.validate(stamp)) {// 如果乐观读失败,转换为悲观读stamp = lock.readLock();try {// 读取共享资源的操作} finally {lock.unlockRead(stamp);}
    }// 写操作
    long writeStamp = lock.writeLock();
    try {// 写入共享资源的操作
    } finally {lock.unlockWrite(writeStamp);
    }
    

区别与适用场景:

  • 性能差异:
    • StampedLock 的性能在某些场景下可能更好,特别是在读多写少的情况下。
  • 功能差异:
    • StampedLock 提供了乐观读锁,可以不阻塞地尝试读取资源,适用于对读操作要求较高的场景。
    • ReadWriteLock 更简单直观,适用于读写操作相对均衡的场景。
  • 适用场景:
    • 如果读操作频繁而写操作较少,且对读操作的并发性能要求较高,可以考虑使用 StampedLock
    • 如果读写操作相对均衡,或者更倾向于简单的实现,可以使用 ReadWriteLock

在选择使用 ReadWriteLock 还是 StampedLock 时,要根据具体的应用场景和性能需求来进行权衡。

结语

ReadWriteLockStampedLock 为我们在多线程环境中进行读写操作提供了强大的支持。ReadWriteLock适用于读写操作相对均衡的场景,而StampedLock则在读多写少的情况下可能更为高效。在实际应用中,根据具体的需求和性能优化目标,选择适合的锁机制是关键。通过深入研究和灵活运用这两种锁机制,希望你能够更加高效地处理多线程编程中的共享资源访问。

 我的其他博客

【MySQL】数据库规范化的三大法则 — 一探范式设计原则-CSDN博客

【JAVA】线程的run()和start()有什么区别?-CSDN博客

【日常聊聊】程序员必备的面试技巧:如何在面试战场上脱颖而出-CSDN博客

【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁-CSDN博客

【JAVA】怎么确保一个集合不能被修改-CSDN博客

【Web开发】会话管理与无 Cookie 环境下的实现策略-CSDN博客

【Mybatis】Mybatis如何防止sql注入-CSDN博客

【软件工程】航行敏捷之路:深度解析Scrum框架的精髓-CSDN博客

【Spring】理解IoC与AOP:构建灵活而模块化的软件架构-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/617410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电梯导轨市场分析:我国市场销量增长率约为2.4%

电梯导轨(The elevator guide rail)是由钢轨和连接板构成的电梯构件,分为轿厢导轨和对重导轨。从截面形状分为T形,L形和空心三种形式。导轨在起导向作用的同时,承受轿厢,电梯制动时的冲击力,安全钳紧急制动时的冲击力等…

javacv和opencv对图文视频编辑-用多张图片合成MP4视频

狠人话不多,直接上代码 package com.bitar.javavideo.test;import org.bytedeco.ffmpeg.global.avcodec; import org.bytedeco.ffmpeg.global.avutil; import org.bytedeco.javacv.FFmpegFrameRecorder; import org.bytedeco.javacv.Java2DFrameConverter;import j…

Camunda Cluster

Rest API:无状态,根据权重路由。控制台API:webapp 登录有状态,根据IP路由。 nginx.conf upstream rest_proxy {server localhost:8080 weight1;server localhost:8081 weight1;server localhost:8082 weight1; }upstream webapp…

《2024 年 Web3.0 数字资产趋势报告》(二)

撰文:方军、周芳鸽、李祺虹、张睿彬,Uweb 编辑:Nona,Techub News 点击关注公众号获取完整报告 接下来我们将继续和大家分享《2024 年 Web3.0 数字资产趋势报告》中其余部分。

PyCharm连接服务器(利用PyCharm实现远程开发)

利用PyCharm实现远程开发 注:该功能只有在PyCharm专业版下才可以使用,并且必须是官方的正版许可,破解版的是不可以使用的!!!可以通过免费教育许可申请使用权限(申请流程)。 pycharm…

QEMU源码全解析 —— PCI设备模拟(6)

接前一篇文章: 上一回讲到了pci_edu_realize函数中的pci_register_bar函数,本回对于其进行详细解析。 再次贴出pci_register_bar函数源码,在hw/pci/pci.c中,代码如下: void pci_register_bar(PCIDevice *pci_dev, in…

在Java中正确使用Optional

Optional类是在Java 8中引入的,用于解决NullPointerException的问题。 java.util.Optional类是一个泛型类型的类,只包含一个类型为T的值。其目的是提供对可能为null的类型T的引用对象的更安全的替代方案。但是,只有在正确使用的情况下&#…

HarmonyOS开发FA应用模型下多个页面的声明方式

目录 方式1 方式2 HarmonyOS配套的IDE是DevEco Studio,目前的版本是3.1。官网可以直接下载 HUAWEI DevEco Studio和SDK下载和升级 | HarmonyOS开发者 ​ 方式1 ​在DevEco Studio如果是在pages目录通过右键New->ArkTS File生成的文件,需要注意&…

Android 13(T) - Media框架(3)- mediaserver

上一节我们了解到android_media_MediaPlayer.cpp中封装的是MediaPlayer native实现,这一节我们就来了解它的内部实现。 1、MediaPlayer MediaPlayer native代码位于frameworks/av/media/libmedia/mediaplayer.cpp 先来看MediaPlayer的声明,它继承于BnM…

鸿蒙原生应用再添新丁!天眼查 入局鸿蒙

鸿蒙原生应用再添新丁!天眼查 入局鸿蒙 来自 HarmonyOS 微博1月12日消息,#天眼查启动鸿蒙原生应用开发#作为累计用户数超6亿的头部商业信息查询平台,天眼查可以为商家企业,职场人士以及普通消费者等用户便捷和安全地提供查询海量…

Vue高级

一 ref属性 被用来给元素或子组件注册引用信息(id的替代者) 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc) 使用方式: 打标识: ...... 或 获取:this.…

ubuntu安装mysql(tar.xz)

1:下载地址 MySQL :: 下载 MySQL 社区服务器 2:上传文件到服务器 3:解压 mkdir mysqlmv mysql-8.0.13-linux-glibc2.12-x86_64.tar.xz /mysqlcd /mysqltar -xvf mysql-8.0.13-linux-glibc2.12-x86_64.tar.xzmv /mysql/mysql-8.…

【Spring类路径Bean定义信息扫描】

Spring类路径Bean定义信息扫描 1. ClassPathBeanDefinitionScanner作用2. 类声明3. 属性4. 构造器5. 扫描方法6. 真正扫描方法7. postProcessBeanDefinition8. 注册bean定义 1. ClassPathBeanDefinitionScanner作用 扫描类路径下的类注册为bean定义。2. 类声明 public class …

后端获取来访url

先说一下:后端是没有办法获取前端来访路径的:a.com访问到b.com,你的程序是b.com,你想获取a.com这个路径,在java后端是获取不到的,反正我网上搜了好久,用了好多种方法都没有获取到,如…

【期末不挂科-C++考前速过系列P3】大二C++第3次过程考核(20道选择题&12道判断题&2道代码题)【解析,注释】

前言 大家好吖,欢迎来到 YY 滴C考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《…

行为型设计模式——状态模式

状态模式 状态模式是比较简单的设计模式,它的主要作用是减少代码中大量的 if-else 或者 switch-case 等逻辑判断(俗称屎山)。它将每个状态定义为一个类,而每个状态类有自己对应的方法,因此当需要根据状态执行逻辑代码…

开源Bluespec bsc编译器和可重用示例设计

这篇介绍Bluespec以及设计示例的文章,是在2021年ICCAD(International Conference On Computer-Aided Design)发布的论文。达坦科技的open-rdma项目和推广的MIT体系结构学习社区都用到Bluespec,因此将此论文翻译成中文,…

app跳转小程序免登录

app跳转小程序二次登录: app跳转小程序,第一种做法是 点击 app 页面 --> 跳转到对应小程序的路径 --> 登录小程序 --> 使用功能。这种做法,在 app跳转小程序后,需要二次登录,用户体验不是很好。 app跳转小…

【JVM】垃圾回收 GC

一、前言 垃圾回收(Garbage Collection,GC)是由 Java 虚拟机(JVM)垃圾回收器提供的一种对内存回收的一种机制,它一般会在内存空闲或者内存占用过高的时候对那些没有任何引用的对象不定时地进行回收。以避免…