ReadWriteLock通过分离读写锁提升读多写少场景的并发性能,允许多个读线程同时访问,写线程独占访问,避免synchronized和ReentrantLock的性能瓶颈。
在多线程环境中,当多个线程频繁读取共享数据而写操作较少时,使用 synchronized 或 ReentrantLock 会导致性能瓶颈,因为它们无论读写都会加锁,限制了并发读取能力。Java 提供了 ReadWriteLock 接口来优化这种“读多写少”的场景,通过分离读锁和写锁,允许多个读线程同时访问资源,而写线程独占访问。
ReadWriteLock 维护了一对锁:

这种设计保证了:
考虑一个简单的键值缓存,读操作远多于写操作。使用 ReentrantReadWriteLock 可显著提升并发性能。
import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class ReadWriteCache{ private final Map cache = new HashMap<>(); private final ReadWriteLock lock = new ReentrantReadWriteLock(); public V get(K key) { lock.readLock().lock(); try { return cache.get(key); } finally { lock.readLock().unlock(); } } public void put(K key, V value) { lock.writeLock().lock(); try { cache.put(key, value); } finally { lock.writeLock().unlock(); } } public void remove(K key) { lock.writeLock().lock(); try { cache.remove(key); } finally { lock.writeLock().unlock(); } } }
在这个例子中:
虽然 ReadWriteLock 能提升读多写少的性能,但使用不当反而会降低效率。
ReadWriteLock 最适合以下情况:
不适合场景:
基本上就这些。合理使用 ReadWriteLock 能有效提升读密集型应用的并发性能,关键在于理解其锁机制并结合实际场景权衡使用。