java.util.concurrent.locks包定义了两个锁类,ReentrantLock类和ReentrantReadWriteLock类。
读写锁适用场景:很多线程从一个数据结构读取数据,而很少线程修改其中数据。这种情况下,允许读者线程共享访问,写者线程互斥访问。
读写锁使用步骤
- 构造一个ReentrantReadWriteLock对象
private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
- 抽取读锁和写锁
private Lock readLock = rwl.readLock(); // 得到一个可以被多个读操作共用的读锁,排斥所有写操作
private Lock writeLock = rwl.writeLock(); // 得到一个写锁,排斥其他读操作和写操作
- 对所有的读取方法加读锁
public double getTotalBalance() {
readLock.lock();
try {...}
finally { readLock.unlock();}
}
- 对所有的修改方法加写锁
public void transfer(...) {
writeLock.lock();
try {...}
finally {writeLock.unlock();}
}