对于读写锁规则有些疑问?

来源:5-12 共享锁和排它锁的用法

youngledo

2020-02-24

图片描述
这个输出结果就是我根据你写的代码输出的。其中线程3为什么在线程1、2读的时候也能进行写呢?

public class CinemaReadWriteLock {

    private static final ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();
    /**
     * 读锁
     */
    private static final ReentrantReadWriteLock.ReadLock readLock = reentrantReadWriteLock.readLock();
    /**
     * 写锁
     */
    private static final ReentrantReadWriteLock.WriteLock writeLock = reentrantReadWriteLock.writeLock();

    /**
     * 读锁:只能多读
     */
    public static void read() {
        readLock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + ":获取到了读锁");
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            readLock.unlock();
            System.out.println(Thread.currentThread().getName() + ":释放了读锁");
        }
    }

    /**
     * 写锁:只能一写
     */
    public static void write() {
        writeLock.lock();
        try {
            System.out.println(Thread.currentThread().getName() + ":获取到了写锁");
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            System.out.println(Thread.currentThread().getName() + ":释放了写锁");
            writeLock.unlock();
        }
    }

    public static void main(String[] args) {
        new Thread(CinemaReadWriteLock::read,"1").start();

        new Thread(CinemaReadWriteLock::read,"2").start();

        new Thread(CinemaReadWriteLock::write,"3").start();

        new Thread(CinemaReadWriteLock::write,"4").start();
    }
}

我用的是JDK 11,发现这个现象与JDK 8不一样。

写回答

1回答

悟空

2020-02-25

我在我电脑运行了你的代码,结果:

1:获取到了读锁

2:获取到了读锁

1:释放了读锁

2:释放了读锁

3:获取到了写锁

3:释放了写锁

4:获取到了写锁

4:释放了写锁


你在你的电脑上用JDK 8 试一试?

1
9
悟空
回复
youngledo
不客气哈,找到原因就好
2020-02-26
共9条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程