news 2026/5/24 18:29:59

Java并发编程:ReentrantReadWriteLock读写锁

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java并发编程:ReentrantReadWriteLock读写锁

前言

在Java并发编程中,锁机制是保证线程安全的重要手段。synchronizedReentrantLock都是排他锁,同一时刻只允许一个线程访问共享资源。但在实际业务场景中,读操作往往远多于写操作,如果多个读线程之间也要互相等待,会严重影响系统性能。

ReentrantReadWriteLock(读写锁)正是为了解决这个问题而设计的。它维护了一对锁:读锁写锁,通过读写分离的策略,大幅提升并发性能。


一、读写锁的核心特性

锁类型特性说明
读锁共享锁多个线程可同时持有读锁
写锁排他锁同一时刻只能有一个线程持有写锁

读写锁遵循以下基本原则:

  • 读-读共享:多个读线程可以同时执行

  • 写-写互斥:多个写线程不能同时执行

  • 读-写互斥:读操作和写操作不能同时进行


二、三种场景代码实战

2.1 读读共享

读锁是共享锁,多个线程可以同时获取读锁,互不阻塞。

public class ReadReadTest { public static void main(String[] args) { MyTask myTask = new MyTask(); new Thread(() -> myTask.read(), "t1").start(); new Thread(() -> myTask.read(), "t2").start(); } static class MyTask { private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public void read() { try { lock.readLock().lock(); System.out.println(Thread.currentThread().getName() + " start"); Thread.sleep(10000); System.out.println(Thread.currentThread().getName() + " end"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.readLock().unlock(); } } } }

运行结果:

t1 start t2 start t1 end t2 end

可以看到,t1和t2几乎同时开始,读锁不互斥。

2.2 写写互斥

写锁是排他锁,同一时刻只能有一个线程持有写锁。

public class WriteWriteTest { public static void main(String[] args) { MyTask myTask = new MyTask(); new Thread(() -> myTask.write(), "t1").start(); new Thread(() -> myTask.write(), "t2").start(); } static class MyTask { private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public void write() { try { lock.writeLock().lock(); System.out.println(Thread.currentThread().getName() + " start"); Thread.sleep(10000); System.out.println(Thread.currentThread().getName() + " end"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.writeLock().unlock(); } } } }

运行结果:

t1 start t1 end t2 start t2 end

t2必须等待t1释放写锁后才能执行,写锁互斥。

2.3 读写互斥

读写操作互斥,读操作进行时写操作必须等待,反之亦然。

public class ReadWriteTest { public static void main(String[] args) { MyTask myTask = new MyTask(); Thread t1 = new Thread(() -> myTask.read(), "t1"); Thread t2 = new Thread(() -> myTask.write(), "t2"); t1.start(); // 确保t1先获取读锁 Thread.sleep(2000); t2.start(); } static class MyTask { private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public void read() { try { lock.readLock().lock(); System.out.println(Thread.currentThread().getName() + " start"); Thread.sleep(10000); System.out.println(Thread.currentThread().getName() + " end"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.readLock().unlock(); } } public void write() { try { lock.writeLock().lock(); System.out.println(Thread.currentThread().getName() + " start"); Thread.sleep(10000); System.out.println(Thread.currentThread().getName() + " end"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.writeLock().unlock(); } } } }

运行结果:

t1 start t1 end t2 start t2 end

t2必须等待t1读完才能开始写,读写互斥。


三、读写锁的适用场景

读写锁特别适合读多写少的业务场景:

场景是否适用原因
缓存系统✅ 非常适合大量读操作,偶尔更新
配置中心✅ 非常适合配置读取频繁,变更极少
计数器❌ 不适合读写比例接近1:1
账户转账❌ 不适合写操作频繁,锁竞争严重

四、注意事项

4.1 锁降级

ReentrantReadWriteLock支持锁降级:写锁可以降级为读锁,但读锁不能升级为写锁。

// 锁降级(允许) writeLock.lock(); readLock.lock(); // 写锁持有状态下获取读锁 writeLock.unlock(); // 仍然持有读锁 // 锁升级(不允许,会死锁) readLock.lock(); writeLock.lock(); // 线程永久阻塞!

5.2 公平性选择

与ReentrantLock一样,读写锁也支持公平/非公平模式:

  • 非公平模式(默认):吞吐量更高,但可能造成写线程饥饿

  • 公平模式:线程按请求顺序获取锁,避免饥饿

// 公平读写锁 ReentrantReadWriteLock fairLock = new ReentrantReadWriteLock(true);

5.3 重入特性

读写锁支持锁重入,但需要注意:

  • 读线程可以重复获取读锁

  • 写线程可以重复获取写锁,也可以获取读锁(锁降级)


六、总结

对比项ReentrantLockReentrantReadWriteLock
锁类型排他锁读写分离
读并发不并发并发
写并发不并发不并发
适用场景读写均衡读多写少

最佳实践:在读操作远多于写操作的场景下,优先考虑使用ReentrantReadWriteLock,它可以显著提升系统吞吐量,让并发性能得到质的飞跃。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/24 18:29:36

终极鸣潮优化指南:3分钟解锁120FPS与专业抽卡分析

终极鸣潮优化指南:3分钟解锁120FPS与专业抽卡分析 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你是否还在为《鸣潮》的60FPS帧率限制而烦恼?是否想科学分析自己的抽卡概率&#…

作者头像 李华
网站建设 2026/5/24 18:19:01

OBS直播计时器插件:6种计时模式让你轻松掌控直播节奏

OBS直播计时器插件:6种计时模式让你轻松掌控直播节奏 【免费下载链接】obs-advanced-timer 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-timer 还在为直播时间管理而烦恼吗?作为主播,你是否经常因为时间控制不当而导致…

作者头像 李华
网站建设 2026/5/24 18:17:48

长期使用Taotoken后对其账单明细与用量分析的依赖程度

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 长期使用Taotoken后对其账单明细与用量分析的依赖程度 在持续使用大模型API进行开发与集成的过程中,对调用成本与资源消…

作者头像 李华
网站建设 2026/5/24 18:14:45

【AIGC内容竞争力突围关键】:为什么92%的ChatGPT使用者不会“讲故事”?资深NLP架构师首曝4层认知断层

更多请点击: https://kaifayun.com 第一章:AIGC内容竞争力突围的关键认知跃迁 当生成式AI从“能写”迈入“懂场景、知约束、可迭代”的新阶段,内容竞争力的本质已悄然迁移——它不再取决于单次输出的流畅度,而系于人机协同的认知…

作者头像 李华