【JAVA】谈谈 ReadWriteLock 和 StampedLock

🍎个人博客:个人主页

🏆个人专栏:JAVA

⛳️ 功不唐捐,玉汝于成


目录

前言

正文

ReadWriteLock(读写锁)

基本原理:

接口和实现:

用法示例:

StampedLock(印戳锁)

基本原理:

接口和实现:

用法示例:

区别与适用场景:

性能差异:

功能差异:

适用场景:

结语

我的其他博客


前言

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

正文

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

ReadWriteLock(读写锁)

基本原理:
  • ReadWriteLock 允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。这可以有效提高多线程环境下对共享资源的并发访问性能。
接口和实现:
  • ReadWriteLock 是一个接口,有两个主要的实现类:ReentrantReadWriteLock 和 ReadWriteLock。
用法示例:
复制代码
   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(印戳锁)

基本原理:
  • StampedLock 也支持读写锁的基本功能,但引入了"印戳"(stamp)的概念,用于标记锁的状态。不同于 ReadWriteLock 的是,StampedLock 提供了乐观读锁和悲观读锁两种读锁。
接口和实现:
  • StampedLock 是一个类,没有直接的接口。它提供了readLock()、writeLock()等方法。
用法示例:
复制代码
   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 时,要根据具体的应用场景和性能需求来进行权衡。

结语

ReadWriteLock 和 StampedLock 为我们在多线程环境中进行读写操作提供了强大的支持。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博客

相关推荐
励志不掉头发的内向程序员2 分钟前
【从零写一个CAD 04】中键拖动平移:抓住一个点,让它一直待在鼠标底下
开发语言·c++·qt·学习·系统架构·计算机外设
tachibana22 小时前
与其他语言相比,使用 Go 有什么好处?
开发语言·后端·golang·go
阿俊-全栈开发6 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
怕浪猫7 小时前
2026 年 AI Agent 面试到底考什么?这套题库覆盖了 90% 的高频考点
面试·aigc·ai编程
wuminyu9 小时前
C++协程实现接收端的零拷贝Buffer管理原理剖析
java·linux·c语言·jvm·c++
m0_380743879 小时前
C++中的freopen的用法实例详解
开发语言·c++
Escalating_xu10 小时前
【Python】基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
zhangrelay10 小时前
ROS项目设计案例智能大模型正经乱答案例
linux·笔记·学习·ubuntu·机器人
probex_10 小时前
学习笔记:知识图谱是什么,在测试里能干什么
笔记·学习·知识图谱
jimy110 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++