关于读写锁的一些理解

发布于:2025-05-12 ⋅ 阅读:(11) ⋅ 点赞:(0)

同一线程的两种情况:

读读:

    public static void main(String[] args) throws InterruptedException {
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        Lock readLock = lock.readLock();
        Lock writeLock = lock.writeLock();

        readLock.lock();
        System.out.println("read1");
        
        readLock.lock();
        System.out.println("read2");
        readLock.unlock();
        
        readLock.unlock();
    }

输出:可重入

读写:

    public static void main(String[] args) throws InterruptedException {
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        Lock readLock = lock.readLock();
        Lock writeLock = lock.writeLock();

        readLock.lock();
        System.out.println("read1");

        writeLock.lock();
        System.out.println("write1");
        writeLock.unlock();

        readLock.unlock();
    }

输出:阻塞了。

写写:

    public static void main(String[] args) throws InterruptedException {
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        Lock readLock = lock.readLock();
        Lock writeLock = lock.writeLock();

        writeLock.lock();
        System.out.println("write1");

        writeLock.lock();
        System.out.println("write2");
        writeLock.unlock();

        writeLock.unlock();
    }

输出:可重入

写读:

    public static void main(String[] args) throws InterruptedException {
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        Lock readLock = lock.readLock();
        Lock writeLock = lock.writeLock();

        writeLock.lock();
        System.out.println("write1");

        readLock.lock();
        System.out.println("read1");
        readLock.unlock();

        writeLock.unlock();
    }

输出:文心一言说这种情况是锁降级,我不懂

不同线程的两种情况:

读读:

    public static void main(String[] args) throws InterruptedException {
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        Lock readLock = lock.readLock();
        Lock writeLock = lock.writeLock();

        readLock.lock();
        System.out.println("read1");

        Thread otherRead = new Thread(new Runnable() {
            @Override
            public void run() {
                readLock.lock();
                System.out.println("otherRead");
                readLock.unlock();
            }
        });
        otherRead.start();
        otherRead.join();
        readLock.unlock();
    }

输出:

read1
otherRead

读写:

    public static void main(String[] args) throws InterruptedException {
        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        Lock readLock = lock.readLock();
        Lock writeLock = lock.writeLock();

        readLock.lock();
        System.out.println("read1");

        Thread otherRead = new Thread(new Runnable() {
            @Override
            public void run() {
                writeLock.lock();
                System.out.println("otherWrite");
                writeLock.unlock();
            }
        });
        otherRead.start();
        otherRead.join();
        readLock.unlock();
    }

输出:

read1

写写:

    public static void main(String[] args) throws InterruptedException {

        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        Lock readLock = lock.readLock();
        Lock writeLock = lock.writeLock();

        writeLock.lock();
        System.out.println("write");

        Thread otherRead = new Thread(new Runnable() {
            @Override
            public void run() {
                writeLock.lock();
                System.out.println("otherWrite");
                writeLock.unlock();
            }
        });
        otherRead.start();
        otherRead.join();//等待其他线程完成。但是otherRead无法获取到锁,被阻塞。
        writeLock.unlock();
    }

输出:

write

写读:

    public static void main(String[] args) throws InterruptedException {

        ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
        Lock readLock = lock.readLock();
        Lock writeLock = lock.writeLock();

        writeLock.lock();
        System.out.println("write");

        Thread otherRead = new Thread(new Runnable() {
            @Override
            public void run() {
                readLock.lock();
                System.out.println("otherRead");
                readLock.unlock();
            }
        });
        otherRead.start();
        otherRead.join();//依旧被阻塞,获取不到读锁
        writeLock.unlock();
    }

输出:

write


网站公告

今日签到

点亮在社区的每一天
去签到