Java Api ReentranReadWriteLock 自带实例
代码:
class CachedData {
Object data;
volatile boolean cacheValid;
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();//@1
if (!cacheValid) {
// 必须在写锁锁上前释放所有的读锁
rwl.readLock().unlock();//@4
rwl.writeLock().lock();//@2
// 重新确认状态,防止其他线程介入先锁了线程并修改了状态
if (!cacheValid) {//@3
data = ...
cacheValid = true;
}
// 读锁可以在写锁内被锁上
rwl.readLock().lock();
rwl.writeLock().unlock(); // 手动解锁写锁,读锁仍保持
}
use(data);
rwl.readLock().unlock();
}
}
重点:
- 读锁是排写锁操作,但不排其他读锁的操作,多个读线程可并发
- 写锁是可以获得读锁的,但写锁锁下前要释放所有读锁
- 写锁必须在所有的读锁释放后才能锁