为什么这个功能永远不会终止



为什么以下函数死锁?换句话说,为什么它不仅阻止任何人获得写锁,还阻止任何人获取读锁?无法读取共享的锁?

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就是这样。对写入进行优先级排序有一定的逻辑:它确保数据是最新的。

您可以让多个线程获得读锁,但当获得写锁时,其他所有线程都会被阻止。由于您从未解锁任何东西,因此方法中的最后一个锁调用将永远不会获得锁。

最新更新