首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >即使当状态被解锁时,ReentrantReadWriteLock也无法获得锁。

即使当状态被解锁时,ReentrantReadWriteLock也无法获得锁。
EN

Stack Overflow用户
提问于 2016-06-21 08:44:49
回答 1查看 1.5K关注 0票数 3

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

代码语言:javascript
复制
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时出错如下:

代码语言:javascript
复制
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)

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

我不明白为何会出现这种情况?为什么即使锁是空闲的,线程也无法获得锁。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-21 11:41:01

在您的示例中,您尝试获取一个写锁,但是读锁已经锁定,这阻止了您获取写锁。

因为您可以获得一个或多个读锁,或者可以获得单个写锁,所以当读取锁被获取时,写锁被标记为Unlocked

尝试以下代码:

代码语言:javascript
复制
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());
}

会有如下的输出:

代码语言:javascript
复制
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]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37939572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档