如何解决为什么此功能永远不会终止?
为什么以下功能会死锁?换句话说,为什么它会阻止任何人不仅获得写锁,而且获得读锁?无法共享读锁?
void testReadWriteLock() throws InterruptedException {
final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
// Other thread acquires read lock and never releases it.
new Thread(() -> lock.readLock().lock()).start();
Thread.sleep(100);
// Other thread attempts (and fails) to acquire write lock.
new Thread(() -> lock.writeLock().lock()).start();
Thread.sleep(100);
lock.readLock().lock(); // This blocks forever
}
解决方法
我发现了ReentrantReadWriteLock
的一个有趣的属性:任何获取写锁的尝试(甚至阻止)都会阻止所有随后的获取读锁的尝试(重入尝试除外)。至少在Oracle 1.8 JVM中就是这种情况。优先考虑写操作有一定的逻辑:它可以确保数据是最新的。
您可以有多个线程获得读取锁定,但是当获得写入锁定时,其他所有人将被阻止。由于您永远不会解锁任何东西,因此该方法中的最终锁定调用将永远不会获得该锁定。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。