我现在在我的代码中使用ReentrantReadWriteLock来同步树状结构的访问。 这个结构很大,可以一次读取多个线程,偶尔修改一小部分,所以它似乎很适合读写的习惯用法。 我明白,在这个特定的类中,不能提高对写入锁的读取locking,因此每个Javadoc必须在获得写入locking之前释放读取locking。 我以前在非重入的上下文中成功地使用了这个模式。 然而,我发现我无法可靠地获得永久封锁的写入locking。 由于读锁是可重入的,我实际上是这样使用简单的代码 lock.getReadLock().unlock(); lock.getWriteLock().lock() 可以阻止,如果我已经获得了readlock reentntly。 每次解锁的呼叫都会减less保持计数,并且只有当保持计数达到零时locking才被释放。 编辑澄清这一点,因为我不认为我最初解释得太好 – 我知道这个类没有内置的锁升级,我不得不简单地释放读锁,并获得写锁。 我的问题是/不pipe其他线程在做什么,调用getReadLock().unlock()可能实际上并不释放这个线程的锁,如果它获得了reentrantly,在这种情况下调用getWriteLock().lock()会永久阻塞,因为这个线程仍然持有读锁,从而阻塞自己。 例如,即使在没有其他线程访问锁的情况下运行singlethreaded,该代码片段也将永远不会到达println语句: final ReadWriteLock lock = new ReentrantReadWriteLock(); lock.getReadLock().lock(); // In real code we would go call other methods that end up calling back and // thus locking again lock.getReadLock().lock(); // Now we do some stuff and realise we need to […]