读写锁通过分离读写锁提升并发性能,允许多个读线程同时访问,写锁独占;ReentrantReadWriteLock 实现读写分离,读锁共享可重入,写锁排他且可降级;支持公平与非公平模式,适用于读多写少场景如缓存,需注意避免读锁升级导致死锁。

Java中的读写锁(ReadWriteLock)是一种特殊的锁机制,它通过分离读操作和写操作的锁来提升并发性能。最常用的实现是 ReentrantReadWriteLock。它的核心特性在于允许多个读线程同时访问共享资源,但写操作是独占的。
1. 读锁与写锁分离
读写锁维护了一对锁:
- 读锁(Read Lock):允许多个线程同时获取,适用于只读操作。只要没有线程在进行写操作,任何数量的读线程都可以持有读锁。
- 写锁(Write Lock):是独占锁,同一时间只能有一个线程持有。当一个线程持有写锁时,其他读线程和写线程都必须等待。
这种分离使得在读多写少的场景下,并发效率远高于普通的互斥锁(如 synchronized 或 ReentrantLock)。
2. 写锁的排他性
写操作会修改共享数据,因此必须保证原子性和可见性:
立即学习“Java免费学习笔记(深入)”;
乐彼多用户商城系统,采用ASP.NET分层技术和AJAX技术,运营于高速稳定的微软.NET+MSSQL 2005平台;完全具备搭建超大型网络购物多用户网上商城的整体技术框架和应用层次LBMall 秉承乐彼软件优秀品质,后台人性化设计,管理窗口识别客户端分辨率自动调整,独立配置的菜单操作锁,使管理操作简单便捷。待办事项1、新订单、支付、付款、短信提醒2、每5分钟自动读取3、新事项声音提醒 店铺管理1
- 当一个线程持有写锁时,其他任何线程(包括读线程)都无法获取读锁或写锁。
- 写锁是可重入的,同一个线程可以多次获取写锁(需对应释放)。
- 写锁支持降级:一个线程在持有写锁的情况下可以获取读锁,然后释放写锁,从而实现“写锁降级为读锁”,以保证数据一致性。
3. 读锁的共享性与不可升级
读锁是共享的,但有一些限制:
- 多个读线程可以同时持有读锁,提高并发读的吞吐量。
- 读锁是可重入的,同一个线程可以多次获取读锁。
- 读锁不能升级为写锁。如果一个线程持有读锁,再去尝试获取写锁,会导致死锁或阻塞(除非使用特定策略避免)。
4. 锁的公平性策略
ReentrantReadWriteLock 支持两种模式:
- 非公平模式(默认):允许插队,可能造成写线程饥饿,但吞吐量较高。
- 公平模式:按照请求顺序分配锁,写线程不会被无限推迟,但性能略低。
可以通过构造函数指定是否启用公平性:
new ReentrantReadWriteLock(true); // 公平锁
基本上就这些。读写锁适合读频繁、写较少的场景,比如缓存、配置管理等。合理使用能显著提升并发性能,但要注意锁的获取和释放顺序,避免死锁。不复杂但容易忽略。










