Java并发编程:ReentrantReadWriteLock详解
ReentrantReadWriteLock 是 Java 并发包中提供的一种读写锁,相较于传统的 synchronized
关键字,它能够实现更细粒度的并发控制,提高程序性能。
为什么需要 ReentrantReadWriteLock ?
- 提高并发性: 允许多个读线程同时访问共享资源,只有写操作会阻塞其他读写操作。
- 可重入性: 持有读锁或写锁的线程可以再次获取同一类型的锁,避免死锁。
- 读写分离: 写锁优先级高于读锁,即使存在多个读锁,写锁也能立即获取。
ReentrantReadWriteLock 的底层原理
- 基于 AbstractQueuedSynchronizer (AQS) 实现,使用 FIFO 等待队列管理线程阻塞和唤醒。
- AQS 的 32 位 state 变量中,高 16 位表示读锁重入次数,低 16 位表示写锁重入次数。
其他关键点
- 读锁和写锁的最大重入次数理论上为 65535,但实际应用中应避免过高的重入次数。
- HoldCounter 内部类用于存储线程的读锁重入次数。
- ThreadLocalHoldCounter 借助 ThreadLocal 为每个线程维护独立的 HoldCounter 实例。
总结
ReentrantReadWriteLock 通过读写分离的策略,在保证数据一致性的前提下,实现了更高的并发性能,适用于读多写少的场景。