1 为什么要使用读写锁,不使用synchronized
- 使用synchronized
synchronized搭配等待通知机制完成并发控制(写操作开始的时候,所有晚于写操作的读操作都会进入等待状态),只有写操作完成并通知后才会将等待的线程唤醒继续执行。
- 使用读写锁
读写锁实现,只需要在读操作的时候获取读锁,写操作的时候获取写锁。当写锁被获取到的时候,后续操作(读写)都会被阻塞,只有在写锁释放之后才会执行后续操作。
2 ReentrantReadWriteLock
特点:
- 具有与ReentrantLock类似的公平锁和非公平锁的实现
默认的支持非公平锁,对于二者而言,非公平锁的吞吐量由于公平锁
- 支持重入
读线程获取读锁之后能够再次获取读锁,写线程获取写锁之后能再次获取写锁,也可以获取读锁。
- 锁能降级
遵循获取写锁、获取读锁在释放写锁的顺序,即写锁能够降级为读锁
3 ReadWriteLock接口
public interface ReadWriteLock {
/**
* 返回读锁
*/
Lock readLock();
/**
* 返回写锁
*/
Lock writeLock();
}