我有一个多线程程序,其中我创建了一个公平值为true的ReadWriteLock实例。此应用程序已停止响应。
下面是我们基于线程转储的发现。一个线程获取了读锁,并在执行过程中阻塞了DB操作。它很长一段时间都没有释放锁。
除了上面的线程,还有另外三个线程。一个线程正在等待获取写锁。然而,另外两个线程正在等待获取读锁。
问题是为什么有两个线程在等待读锁?这是不是因为公平值为真,请求写锁的线程比请求读锁的两个线程来得早?如果请求写入的线程较早到达,系统会阻止请求读锁定的线程吗?
发布于 2015-03-21 02:40:39
当您将Java ReentrantReadWriteLock的公平值设置为true时,如果当前有一个线程正在等待获取写锁,那么获取读锁的尝试将会阻塞。在Javadoc中:
如果持有写锁定,或者存在等待的写入线程,则尝试获取公平读锁定(非重入)的线程将阻塞。
在您的情况下,一旦当前读取完成,等待写入的线程将被允许写入,然后等待读取的其他线程将被允许读取。
https://stackoverflow.com/questions/29173120
复制相似问题