请稍等 ...
×

采纳答案成功!

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

锁降级以后发现还是持有写锁

通过代码发现锁降级以后发现还是持有写锁
在 readLock.lock(); 后
writeLock.isHeldByCurrentThread() 仍然为true

private static void writeDowngrading() {
        writeLock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + "得到了写锁,正在写入");
            Thread.sleep(1000);
            readLock.lock();
            System.out.println("在不释放写锁的情况下,直接获取读锁,成功降级");
            // 打印为true:说明降级后仍持有写锁
            System.out.println(writeLock.isHeldByCurrentThread());

        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            readLock.unlock();
            System.out.println(Thread.currentThread().getName() + "释放写锁");
            writeLock.unlock();
            // 打印为false:不再持有写锁
            System.out.println(writeLock.isHeldByCurrentThread());
        }
    }

锁降级以后仍然持有写锁,那么降级的意义何在呢?岂不是其他想要读的线程依然要阻塞,为什么在设计的时候没有在降级的时候直接把写锁释放呢?

锁的降级和我们自己 获取写锁 --> 释放写锁 --> 获取读锁 --> 读取数据 --> 释放读锁 有什么区别呢?

正在回答 回答被采纳积分+3

1回答

悟空 2020-08-03 01:22:09

我觉得你的观点很棒,确实,如果能自动释放写锁,会比较不错,不过这是Lock的特点,不会自动帮我们释放锁和上锁,所有都要写代码来体现。

锁降级的意义在于,不用彻底释放锁,这样就能始终持有锁,不担心被抢,如果是你写的获取写锁 --> 释放写锁 --> 获取读锁 --> 读取数据 --> 释放读锁,那么中间释放写锁后,就可能被抢,这样当前任务就不连贯了,这就是锁降级的意义。

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