【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.hqwc.cn/news/344772.html

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

相关文章

统信UOS_麒麟KYLINOS与Windows通过Open SSH实现文件传输

原文链接:统信UOS/麒麟KYLINOS与Windows通过Open SSH实现文件传输 hello,大家好啊!今天我要给大家介绍的是在统信UOS或麒麟KYLINOS操作系统与Windows系统之间通过Open SSH实现文件传输的方法。在日常工作中,我们经常需要在不同操作…

使用Pygame库来显示一个简单的窗口,并绘制一些基本的形状和文本

import pygame from pygame.locals import *# 初始化pygame库 pygame.init()# 创建窗口并设置大小和标题 screen_width 800 screen_height 600 screen pygame.display.set_mode((screen_width, screen_height)) pygame.display.set_caption("My Pygame")# 定义颜色…

leetcode 2645. 构造有效字符串的最少插入数-python

题目: 给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到,则认为该字符串 有效 。 解题方法 1.先判断字符串是否…

七麦数据js逆向(补环境版)

本文目标地址如下,使用base64解码获得 aHR0cHM6Ly93d3cucWltYWkuY24vcmFuay9tYXJrZXRSYW5rL21hcmtldC82L2NhdGVnb3J5LzUvY29sbGVjdGlvbi9hbGwvZGF0ZS8yMDI0LTAxLTEy 本文逆向破解分为扣代码版和补环境版,扣代码版请看专栏另一篇文章 废话不多说了&#…

电脑上不安装Oracle,但是虚拟机装了Oracle,怎么连接到虚拟机里的Oracle数据库呢?

1、准备工作 1.1、确定数据库版本信息 注:如果知道数据库的版本信息,这个步骤可以跳过。 比较简单的方法,直接看数据库的安装位置,也就是数字(但是这个方法确定就是,不好确定是多少位的数据库)…

python 语法

闭包 在函数嵌套的前提下&#xff0c;内部函数使用了外部函数的变量&#xff0c;并且外部函数返回了内部函数&#xff0c;我们把这个使用外部函数变量的内部函数称为闭包。 def outfunc(arg):def innerFunc(msg):print(f"<{msg}> {arg} <{msg}>")retu…

Typora上传图片失败PicGo

起初我是在Typora中点击一键上传图片&#xff0c;结果如下&#xff0c;报错。可是我找了半天也没错啊。 最后发现原来是一个图片的命名问题&#xff0c;名字太过于复杂&#xff0c;PicGo识别不出&#xff0c;一个图片报错导致其它也上传不了。 我把它复制到其它文件夹之后&…

掌握 Vue 响应式系统,让数据驱动视图(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

使用Pygame库创建了一个窗口,并在窗口中加载了一个名为“ball.png“的图片,通过不断改变物体的位置,实现了一个简单的动画效果

import pygame import sys# 初始化Pygame pygame.init()# 创建窗口 screen pygame.display.set_mode((640, 480))# 加载图片 image pygame.image.load("ball.png")# 将物体初始位置设为屏幕左上角 x 0 y 0# 游戏循环 while True:# 处理事件for event in pygame.e…

Sip - Ubuntu 配置 miniSIPServer 服务器(测试用)

客户提供的账号过期了&#xff0c;简单搭建 SIP 服务器&#xff0c;以便测试使用。个人认为这个配置起来最为简单&#xff0c;且测试功能足够。 官网miniSIPServer - 基于 Windows 以及 Linux 平台的 VoIP (SIP) 服务器软件. miniSIPServer 可能是最容易使用的 VoIP(SIP) 服务器…

【Git】本地仓库文件的创建、修改和删除

目录 一、基本信息设置 1、设置用户名2、设置用户名邮箱 二、Git仓库操作介绍 1、创建一个新的文件夹2、在文件内初始化git仓库&#xff08;创建git仓库&#xff09;3、向仓库中添加文件 1.创建一个文件2.将文件添加到暂存区3.将暂存区添加到仓库 4、修改仓库文件 1.修改文件2.…

哈希-力扣350. 两个数组的交集Ⅱ

题目 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可以不考虑输出结果的顺序。 示…