整体代码
if (!cacheValid){
// 释放读锁
rw.readLock().unlock();
// 获取写锁, 多个线程只能争抢到一个更新缓存的执行名额
rw.writeLock().lock();
try {
// 任意一个线程完成缓存更新, 后续等待写锁的无需执行以下逻辑
if (!cacheValid){
data = new Object();
cacheValid = true;
}
// 写入缓存成功, 锁降级为读锁
// 获取读锁的原因: 不放弃写锁就获取读锁,代表业务逻辑不中断,否则还要重新竞争锁。
rw.readLock().lock();
} finally {
rw.writeLock().unlock();
}
}
try {
// 读到缓存数据并打印
System.out.println(data);
} finally {
rw.readLock().unlock();
}
有疑惑的部分:如下代码块,if后跟了个rw.readLock().lock
if (!cacheValid){
data = new Object();
cacheValid = true;
}
rw.readLock().lock();
rw.readLock().lock()
是否存在一种不执行的情况:if内的代码抛异常,
那么这种潜在的情况,可能会使如下的finally
语句内的代码报错吧
try {
// 读到缓存数据并打印
System.out.println(data);
} finally {
rw.readLock().unlock();
}
以上,两个问题:
rw.readLock().lock();
是否存在执行不到的情况rw.readLock().unlock();
unlock一个未加锁的对象, 是否会报错