【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博客

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

UE5 简易MC教程学习心得

https://www.bilibili.com/video/BV12G411J7hV?p13&spm_id_frompageDriver&vd_sourceab35b4ab4f3968642ce6c3f773f85138 ———— 目录 0.摧毁逻辑学习 1.发光材质灯方块 2.封装。想让子类 不更改父类的变量。 3.材质命名习惯。 0.摧毁逻辑学习 达到摧毁的条件…

日志审计系统Agent项目创建——读取日志文件(Linux版本)

紧接着上一篇的分享,继续做日志文件的读取,点击连接即可日志文件初始化https://blog.csdn.net/wjl990316fddwjl/article/details/135553238 1、将指针移动到文件末尾 //文件移动到结尾fseek(fp, 0, SEEK_END); 2、定义当前指针的位置 lastPosition ft…

通义灵码 - 免费的阿里云 VS code Jetbrains AI 编码辅助工具

系列文章目录 前言 通义灵码,是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云 SDK/OpenAPI 的使用…

专业130+总分400+杭州电子科技大学843信号与系统考研经验杭电信息通信

今年专业课130,数一130,初试总分400,顺利上岸杭电通信工程学院,回望这一年有得有失,总结了一些经验分享给大家,希望对大家复习有帮助。 我的初试备考从3月开始,持续到初试前,这中间…

x-cmd pkg | tsx - Node.js 的直接替代品

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 tsx 代表 “TypeScript execute”,由 TypeScript 编写,内部使用由 Go 语言编写的 esbuild 核心二进制实现超快的 TypeScript 编译,旨在增强 Node.js 以无缝运行 TypeScript / ESM /…

小学信息科技Python课程第2课:坐标与画笔

一、turtle画布与坐标系 在同一平面互相垂直且有公共原点的两条数轴构成平面直角坐标系。在坐标系中,水平方向的轴都称为x轴,垂直方向的轴都称为y轴 它们相交于O点,在这一个点里,x轴的值为0,y轴的值也为0,所…

业务向——基于淘宝联盟平台的CPS

业务向——基于淘宝联盟平台的CPS 导读小试牛刀签名商品活动订单获取及用户 导读 上篇文章我们分享了多多进宝平台,那么这篇文章想继续带来CPS业务的分享,这次玩转的平台是淘宝联盟。在对接的过程中,也是踩了一些坑,特别是对于订…

git修改历史(非最新)提交信息

二、修改最近第二次或更早之前的commit信息 当前有三次提交,从近到远分别为1、2、3 以修改第2次提交为例(从最新往前数) 1、使用命令git rebase -i HEAD~2 按i进入编辑模式,将对应的pick改为edit,然后ctrlc退出。最…

环形链表[简单]

优质博文:IT-BLOG-CN 一、题目 给你一个链表的头节点head,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪next指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数pos来表示链…

【算法与数据结构】62、LeetCode不同路径

文章目录 一、题目二、解法2.1 动态规划解法2.2 数论解法 三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 2.1 动态规划解法 思路分析:机器人只能向下或者向右移动,那么到达&a…

Komodor:Kubernetes 监控工具全面指南

为了方便起见,Komodor 提供了一个简单的 Web 界面,以帮助您监控 Kubernetes 集群的状态。它拥有付费和免费增值计划,除了在出现问题时通知用户外,还拥有一系列方便的工具,用于跟踪和管理集群中部署的资源的状态。让我们…

单片机I/O口驱动MOS管

自记录: 使用单片机做一个PLC,输出可如下两种情况: 单片机I/O口驱动,为什么一般都选用三极管而不是MOS管? 1.单片机的IO口,有一定的带负载能力。但电流很小,驱动能力有限,一般在10-20mA以内。…

【Java SE语法篇】6.数组

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 文章目录 1.数组的基本概念1.1 为什么使用数组?1.…

Realm Management Extension领域管理扩展之安全状态

RME基于Arm TrustZone技术。TrustZone技术在Armv6中引入,提供以下两个安全状态: 安全状态(Secure state)非安全状态(Non-secure state)以下图表显示了在AArch64中的这两个安全状态以及通常在每个安全状态中找到的软件组件: 该架构将在安全状态运行的软件与在非安全状态运…

【Linux实用篇】Linux常用命令(1)

目录 1.1 Linux命令初体验 1.1.1 常用命令演示 1.1.2 Linux命令使用技巧 1.1.3 Linux命令格式 1.2 文件目录操作命令 1.2.1 ls 1.2.2 cd 1.2.3 cat 1.2.4 more 1.2.5 tail 1.2.6 mkdir 1.2.7 rmdir 1.2.8 rm 1.1 Linux命令初体验 1.1.1 常用命令演示 在这一部分中…

C#,卡特兰数(Catalan number,明安图数)的算法源代码

一、概要 卡特兰数(英语:Catalan number),又称卡塔兰数、明安图数,是组合数学中一种常出现于各种计数问题中的数列。以比利时的数学家欧仁查理卡特兰的名字来命名。1730年左右被蒙古族数学家明安图使用于对三角函数幂…

Linux 【C编程】IO进阶— 阻塞IO、非阻塞IO、 多路复用IO、 异步IO

文章目录 1.阻塞IO与非阻塞IO1.1为什么有阻塞式?1.2非阻塞 2.阻塞式IO的困境3.并发IO的解决方案3.1非阻塞式IO3.2多路复用IO3.2.1什么是多路复用IO?3.2.1多路复用IO select原理3.2.1多路复用IO poll原理 3.3异步IO 1.阻塞IO与非阻塞IO 1.1为什么有阻塞式…

国产麒麟系统开机没有网络需要点一下这个设置

问题描述: 一台国产电脑网线连接正常,打开网页后显示无法访问,那么是什么原因无法上网呢?下面就告诉你一个小方法去解决一下这个问题; 检查故障: 检测交换机、网线、水晶头全都正常,同房间摆放的…

ZooKeeper 实战(二) 命令行操作篇

文章目录 ZooKeeper 实战(二) 命令行操作篇1. 服务端命令1.1. 服务启动1.2. 查看服务1.3. 重启服务1.4. 停止服务 2. 客户端命令2.1. 启动客户端2.2. 查看节点信息查看根节点详情 ls -s /添加一个watch监视器 ls -w /列举出节点的级联节点 ls -R / 2.3. 查看节点状态2.4. 创建节…

Jenkins 问题

从gitlab 仓库拉去代码到Jenkins本地报错 ERROR: Couldn’t find any revision to build. Verify the repository and branch configuration for this job. 问题原因: 创建条目》配置的时候,gitlab仓库不存在master分支 修复后: