请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于案例代码的疑问

整体代码

        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();
        }

以上,两个问题:

  1. rw.readLock().lock(); 是否存在执行不到的情况
  2. rw.readLock().unlock(); unlock一个未加锁的对象, 是否会报错

正在回答

1回答

小伙伴思考得很全面, 点赞。

1,在if里面语句复杂的情况下,是存在的。

2. 如果 unlock一个未加锁的对象, 是会报错的。


示例代码选取自ReentrantReadWriteLock源码的注释部分,作者是Doug Lea,是一个降级用法的示例。

我们能做的就是尽量保证if内语句短小和可靠,避免发生异常。

1 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信