的ReentrantReadWriteLock未能得到锁定,即使其状态解锁

问题描述:

我尝试使用下面的代码段一个线程获得锁:的ReentrantReadWriteLock未能得到锁定,即使其状态解锁

Lock lock = readLock ? getLock(key).readLock() : getLock(key).writeLock(); 
try { 
    boolean locked = lock.tryLock(DEFAULT_TRY_TIME, DEFAULT_TRY_TIME_UNIT); //line 3 
    // If false, lock is not acquired 
    if (!locked) { 
     throw new TryLockTimeoutException(
       key + ": Failed to acquire " + lock + " within " + DEFAULT_TRY_TIME_STRING); 
    } 
} 

线30分钟因此TryLockTimeoutException被抛出,错误为后3点返回false :

com.concurrent.TryLockTimeoutException: keyIp : Failed to acquire [email protected]2cee[Unlocked] within 30MINUTES 
    at com.concurrent.NeAccessLockMap.acquireReadOrWriteLock(NeAccessLockMap.java:72) 

请注意,锁状态显示为错误解锁。

我无法理解为什么会发生这种情况?即使锁定空闲,为什么线程无法锁定?

+1

锁定读锁吗? – tkausl

+0

它不会检查读/写锁吗? – Batty

+0

我不确定,但我不这么认为。为什么它应该在写锁上打印'Locked',当它实际上是锁定的锁定,而不是写锁? – tkausl

在您的示例中,您尝试获取写入锁定,但读取锁定已锁定,这会阻止您获取写入锁定。

因为您可以获取一个或多个读取锁定或获取单个写入锁定,所以当存在读取锁定时,写入锁定将被标记为Unlocked

试试下面的代码:

ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); 
new Thread() { 
    @Override 
    public void run() { 
     readWriteLock.readLock().lock(); 
     try { 
      // block the read lock 
      Thread.sleep(5000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
}.start(); 
if (!readWriteLock.writeLock().tryLock(1, TimeUnit.SECONDS)) { 
    System.out.println(readWriteLock); 
    System.out.println(readWriteLock.readLock()); 
    System.out.println(readWriteLock.writeLock()); 
} 

将有类似的输出:

[email protected][Write locks = 0, Read locks = 1] 
[email protected]a04[Read locks = 1] 
[email protected]38a9[Unlocked]