下面这个例子非常实用,我是 javadoc 的搬运工:
// 这是一个关于缓存操作的故事
classCachedData{
Object data;
volatileboolean cacheValid;
// 读写锁实例
final ReentrantReadWriteLock rwl =newReentrantReadWriteLock();
voidprocessCachedData(){
// 获取读锁
rwl.readLock().lock();
if(!cacheValid) {// 如果缓存过期了,或者为 null
// 释放掉读锁,然后获取写锁 (后面会看到,没释放掉读锁就获取写锁,会发生死锁情况)
rwl.readLock().unlock();
rwl.writeLock().lock();
try{
if(!cacheValid) {// 重新判断,因为在等待写锁的过程中,可能前面有其他写线程执行过了
data = ...
cacheValid =true;
}
// 获取读锁 (持有写锁的情况下,是允许获取读锁的,称为 “锁降级”,反之不行。)
rwl.readLock().lock();
}finally{
// 释放写锁,此时还剩一个读锁
rwl.writeLock().unlock();// Unlock write, still hold read
}
}