为什么这个函数永远不会终止?
Why does this function never terminate?
为什么下面的函数会死锁?换句话说,为什么它不仅阻止任何人获得写锁,还阻止任何人获得读锁?无法共享读锁?
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
的一个有趣的 属性:任何获取写锁的尝试(甚至阻塞)都会阻止所有后续获取读锁的尝试(re-entrant 尝试除外)。至少,Oracle 的 1.8 JVM 就是这种情况。优先写入有一定的逻辑:它确保数据是 up-to-date.
你可以让多个线程获得读锁,但是当获得写锁时,其他线程都被阻塞了。由于您永远不会解锁任何东西,因此方法中的最终锁定调用永远不会获得锁定。
为什么下面的函数会死锁?换句话说,为什么它不仅阻止任何人获得写锁,还阻止任何人获得读锁?无法共享读锁?
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
的一个有趣的 属性:任何获取写锁的尝试(甚至阻塞)都会阻止所有后续获取读锁的尝试(re-entrant 尝试除外)。至少,Oracle 的 1.8 JVM 就是这种情况。优先写入有一定的逻辑:它确保数据是 up-to-date.
你可以让多个线程获得读锁,但是当获得写锁时,其他线程都被阻塞了。由于您永远不会解锁任何东西,因此方法中的最终锁定调用永远不会获得锁定。