Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ReentrantReadWriteLock即使在其状态为Unlocked时也无法获取锁_Java_Multithreading_Reentrantlock - Fatal编程技术网

Java ReentrantReadWriteLock即使在其状态为Unlocked时也无法获取锁

Java ReentrantReadWriteLock即使在其状态为Unlocked时也无法获取锁,java,multithreading,reentrantlock,Java,Multithreading,Reentrantlock,我尝试使用以下代码锁定线程: 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) { thro

我尝试使用以下代码锁定线程:

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);
    }
}
第3行在30分钟后返回false,因此抛出
TryLockTimeoutException
,错误如下:

com.concurrent.TryLockTimeoutException: keyIp : Failed to acquire java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock@74be2cee[Unlocked] within 30MINUTES
    at com.concurrent.NeAccessLockMap.acquireReadOrWriteLock(NeAccessLockMap.java:72)
请注意,锁定状态在错误中显示为解锁


我不明白为什么会发生这种情况?为什么即使在锁空闲时线程也无法获得锁。

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

因为您可以获取一个或多个读锁,或者获取一个写锁,所以当获取了读锁时,写锁被标记为
未锁定

请尝试以下代码:

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());
}
将有如下输出:

java.util.concurrent.locks.ReentrantReadWriteLock@31221be2[Write locks = 0, Read locks = 1]
java.util.concurrent.locks.ReentrantReadWriteLock$ReadLock@377dca04[Read locks = 1]
java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock@728938a9[Unlocked]

读锁被锁定了吗?它不会检查两个读/写锁吗?我不确定,但我不这么认为。为什么它要在写锁上打印
Locked
,而实际上是读锁而不是写锁?