读取和写入锁定线程等待读取锁定

时间:2015-03-20 18:09:46

标签: multithreading reentrantreadwritelock

我有一个多线程程序,我在其中创建了一个公平值为true的ReadWriteLock实例。 此应用程序已停止响应。

以下是我们基于线程转储的发现。 一个线程获取了读锁定,并在执行期间在DB操作中被阻塞。它没有长时间释放锁定。

除上述线程外,还有三个线程。 一个线程正在等待获取写锁定。 然而,另外两个线程正在等待获取读锁定。

问题是为什么两个线程都在等待读锁? 是否发生这种情况是因为公允价值为真,请求写锁定的线程比请求读锁定的两个线程更早出现? 如果请求写入的线程来得更早,系统会阻塞请求读锁定的线程吗?

1 个答案:

答案 0 :(得分:1)

当您将Java ReentrantReadWriteLock的公平值设置为true时,如果有一个当前正在等待获取写锁定的线程,则尝试获取读锁定将会阻止。来自Javadoc:

“如果持有写锁定,或者有等待的写入程序线程,则尝试获取公平读锁定(非重复)的线程将阻塞。”

在您的情况下,一旦当前读取完成,将允许等待写入的线程写入,然后允许等待读取的其他线程读取。