java.util.concurrent.locks包提供了已实现Read-Write Lock模式的ReadWriteLock接口和ReentrantReadWriteLock类。
java.util.concurrent.locks.ReadWriteLock接口的“用于读取的锁”和“用于写入的锁”是通过其他对象来实现的。获取锁和释放锁的方法:
- readLock.lock()
- readLock.unlock()
- writeLock.lock()
- writeLock.unlock()
java.util.concurrent.locks.ReentrantReadWriteLock类实现了ReadWriteLock接口。ReentrantReadWriteLock类的主要特征如下:
公平性
当创建ReentrantReadWriteLock类的实例时,可以选择锁的获取顺序是否要设为公平(fair)的。如果创建的实例是公平的,那么等待时间久的线程将可以优先获取锁。
可重入性
ReentrantReadWriteLock类的锁是可重入的(reentrant)。也就是说,Reader角色的线程可以获取“用于写入的锁”,Writer角色的线程也可以获取“用于读取的锁”。
锁降级
ReentrantReadWriteLock类可以按如下顺序将“用于写入的锁”降级为“用于读取的锁”:
获取用于写入的锁->获取用于读取的锁->释放用于写入的锁
但是,“用于读取的锁”不可以升级为“用于写入的锁”。
便捷方法
ReentrantReadWriteLock类提供了获取等待中的线程的个数的方法getQueueLength,以及检查是否获取了用于写入的锁的方法isWriteLocked等便捷方法。
使用java.util.concurrent.locks
Data.java
1 | import java.util.concurrent.locks.ReentrantReadWriteLock; |