java 中 synchronized 是内置的互斥锁,同一时刻只允许一个线程访问,无法区分读多写少的场景;而读写锁(如 reentrantreadwritelock)通过分离读锁和写锁,允许多个读线程同时执行,仅在写入时阻塞,从而显著提升并发读取性能。

synchronized 在并发读取时的表现如何
synchronized 无论读取还是写入都会获取独占锁,导致多个读线程必须串行执行。即使数据完全不变,读操作也会互相阻塞,造成不必要的等待。

public class SyncExample {
private int data = 0;
public synchronized int read() {
return data;
}
public synchronized void write(int value) {
this.data = value;
}
}
上述代码中,read() 和 write() 都使用 synchronized 修饰。当多个线程调用 read() 时,它们会排队依次执行,无法并行。这在高读低写的场景下会导致吞吐量下降。
立即学习“Java免费学习笔记(深入)”;
ReentrantReadWriteLock 如何实现读写分离
ReentrantReadWriteLock 提供 readLock() 和 writeLock() 两个独立的锁对象。读锁是共享锁,多个线程可同时持有;写锁是排他锁,仅允许一个线程持有,且会阻塞所有读锁和写锁。

import java.util.concurrent.locks.ReentrantReadWriteLock;
public class RwlExample {
private final ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private int data = 0;
public int read() {
rwLock.readLock().lock();
try {
return data;
} finally {
rwLock.readLock().unlock();
}
}
public void write(int value) {
rwLock.writeLock().lock();
try {
this.data = value;
} finally {
rwLock.writeLock().unlock();
}
}
}
该示例中,read() 方法获取读锁,允许多个线程同时进入;write() 方法获取写锁,确保写入时的原子性。这种设计在读多写少时能大幅提升并发能力。
读写锁在频繁写入时的行为变化
当写入频率较高时,ReentrantReadWriteLock 的写锁会频繁阻塞读锁,导致读线程大量等待。此时,读写锁的优势减弱,甚至可能因锁升级开销而比 synchronized 更慢。


















