加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在同一个try块中锁定多个ReentrantReadWriteLocks是否安

发布时间:2020-12-14 05:54:28 所属栏目:Java 来源:网络整理
导读:假设我有两个关键资源,foo和bar.我用一些 ReentrantReadWriteLock 保护它们 ReentrantReadWriteLock foo = new RRWL() ...ReentrantReadWriteLock bar = new RRWL() ... 大多数操作只使用foo OR bar,但其中一些恰巧使用两者.现在使用单个锁时,您不能只这样做
假设我有两个关键资源,foo和bar.我用一些 ReentrantReadWriteLock保护它们
ReentrantReadWriteLock foo = new RRWL() ...
ReentrantReadWriteLock bar = new RRWL() ...

大多数操作只使用foo OR bar,但其中一些恰巧使用两者.现在使用单个锁时,您不能只这样做:

void foo() {
   foo.writeLock().lock();
   privateWorkOnFoo();
   foo.writeLock().unlock();
}

如果抛出异常,你的foo将永远被锁定.相反,你把它包起来,就像

void foo() {
    try {
        foo.writeLock().lock();
        privateWorkOnFoo();
    } finally { foo.writeLock().unlock(); }
}

但是,如果我需要同时工作呢?将它们放在一个块中是否安全?

选项1

try {
    foo.writeLock().lock();
    bar.writeLock().lock();
    magic();
} finally { 
    bar.writeLock().unlock();
    foo.writeLock().unlock();
}

或者是否有必要为每个锁提供自己的块:

选项2

try {
    foo.writeLock().lock();
    try {
        bar.writeLock().lock();
        magic();
    } finally { 
      bar.writeLock().unlock();
    }

} finally { 
    foo.writeLock().unlock();
}

我不可能是第一个很难对此进行调查的人…我知道选项2有“防弹”,但它也是一个相当多的维护.选项1是否可以接受?

解决方法

选项1没问题.它被称为两种锁定变体.如果你看一下LinkedBlockingQueue操作,比如remove,它会锁定putLock和takeLock.以下是JDK的功能示例:
public boolean remove(Object o) {
       if (o == null) return false;
       fullyLock();
       try
       {
       // ...
       }   
       finally {
         fullyUnlock();
       }
    }

   /**
     * Lock to prevent both puts and takes.
     */
    void fullyLock() {
        putLock.lock();
        takeLock.lock();
    }

    /**
     * Unlock to allow both puts and takes.
     */
    void fullyUnlock() {
        takeLock.unlock();
        putLock.unlock();
    }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读