请稍等 ...
×

采纳答案成功!

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

图片描述

锁降级的时候这个线程同时持有读锁和写锁,是否和要么多读要么一写这句话有冲突呢?

如果在降级的时候不释放写锁,我发现其他线程想要获取读锁还是获取不到呢老师,也就是说即使降级成功后,也得等释放了写锁其他读的线程才能得到读锁,大家还是不能跟它一起读取,除非先释放掉写锁。实验代码如下

public class Upgrading {
    private static ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(false);
    private static ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
    private static ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();
    private static void readUpgrading(){
        readLock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"得到了读锁,正在读取");
            Thread.sleep(1000);
            System.out.println("升级会带来阻塞");
            writeLock.lock(); //升级为写锁
            System.out.println(Thread.currentThread().getName() + "获取到了写锁,升级成功");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println(Thread.currentThread().getName()+"释放读锁");
            readLock.unlock();
        }
    }

    private static void writeDowngrading(){
        writeLock.lock();
        try {
            System.out.println(Thread.currentThread().getName()+"得到了写锁,正在写入");
            Thread.sleep(1000);
            readLock.lock();
            System.out.println("在不释放写锁的情况下,直接获取读锁,成功降级");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println(Thread.currentThread().getName()+"释放读锁");
            readLock.unlock();
            System.out.println(Thread.currentThread().getName()+"释放写锁");
            //writeLock.unlock();  //这里选择不释放写锁
        }
    }

    public static void main(String[] args) throws InterruptedException {
        System.out.println("先演示降级是可以的");
        Thread thread1 = new Thread(()->writeDowngrading(),"Thread1");
        thread1.start();
//        thread1.join();
//        System.out.println("----------------");
//
//        System.out.println("演示升级是不行的");
//        Thread thread2 = new Thread(()->readUpgrading(),"Thread2");
//        thread2.start();


        Thread thread3 = new Thread(()->readUpgrading(),"Thread3");
        thread3.start();

    }
}

控制台输出
图片描述

添加回答

已采纳回答

锁降级的时候这个线程同时持有读锁和写锁,是否和要么多读要么一写这句话有冲突呢?:是的,更严谨是说法是,要么多读要么一写,是针对多个线程而言的。同一个线程,可以同时持有读锁和写锁。

问题2:是的,得等释放了写锁其他读的线程才能得到读锁

2020-10-12 11:27:18
  • 提问者 Panda_io #1
    收到,明白了谢谢老师!!!
    2020-10-12 11:30:06

玩转Java并发工具,精通JUC,成为并发多面手

难度中级
时长18小时52分钟
人数1118
好评度100%

JUC全方位讲解,构建并发工具类知识体系,从使用到原理的多维度剖析

讲师

悟空 JAVA开发工程师

硕士毕业于世界排名Top 9的慕尼黑工业大学(计算机学科排名),国内毕业于同济大学,成绩专业排名Top 1,获公派留学全额奖学金,现就职于一线明星互联网公司。 课程深入浅出、系统全面、通俗易懂、干货满满。 讲课时充满热情,声情并茂,全程无废话,生动有趣。

意见反馈 帮助中心 APP下载
官方微信