Questions tagged «reentrantreadwritelock»

12
Java ReentrantReadWriteLocks-如何安全获取写锁?
我现在在代码中使用ReentrantReadWriteLock来同步树状结构的访问。这种结构很大,可以被许多线程同时读取,偶尔对其一部分进行修改,因此似乎很适合读写习惯。我知道对于这一特定类,不能将读取锁提升为写入锁,因此根据Javadocs,必须在获得写入锁之前释放读取锁。之前,我已经在非可重入上下文中成功使用了这种模式。 但是,我发现我无法可靠地获取写锁而不会永远阻塞。由于读锁是可重入的,而我实际上是这样使用的,因此简单的代码 lock.getReadLock().unlock(); lock.getWriteLock().lock() 如果我重新获得了readlock,则可以阻止。每次解锁请求只会减少保留计数,并且只有在保留计数达到零时才实际释放锁定。 编辑以澄清这一点,因为我认为我一开始解释得不太好-我知道此类中没有内置的锁升级,并且我必须简单地释放读取锁并获得写入锁。我的问题是/不管其他线程在做什么,如果重新获得了该调用,则调用getReadLock().unlock()实际上可能不会释放该线程的锁定,在这种情况下,getWriteLock().lock()由于此线程仍在读取状态,因此对它的调用将永远阻塞锁定并因此阻止自身。 例如,即使在没有其他线程访问锁的情况下运行单线程,此代码片段也永远不会到达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 write so try to …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.