首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于Lock.lock和Lock.unlock,我们将如何使用“最终尝试”

对于Lock.lock和Lock.unlock,我们将如何使用“最终尝试”
EN

Stack Overflow用户
提问于 2011-01-12 02:03:00
回答 2查看 7.6K关注 0票数 6

请考虑以下代码。为了防止IndexOutOfBoundsException调用listIterator,我们使用读取器锁检索基于索引的iteartor,在stockCodes上写入操作时使用写入锁。

注意,我们没有使用任何锁定机制来使用listIterator来迭代,因为它来自CopyOnWriteArrayList。不需要锁定,因为不会抛出ConcurrentModificationException

代码语言:javascript
复制
// stockCodesReaderLock is reader lock from java.util.concurrent.locks.ReadWriteLock
// stockCodes is CopyOnWriteArrayList
// Acquire iterator in a safe way.
stockCodesReaderLock.lock();
final int stockCodesSize = stockCodes.size();
if (currIndex < stockCodesSize) {
    listIterator = stockCodes.listIterator(currIndex);
}
stockCodesReaderLock.unlock();

我在想,我是否应该使用try/finally块,因为我看不到出现异常的任何机会。如果必须使用try/finally,我应该使用(A)还是(B)

我有什么需要吗?

(A)

代码语言:javascript
复制
try {
    stockCodesReaderLock.lock();
    final int stockCodesSize = stockCodes.size();
    if (currIndex < stockCodesSize) {
        listIterator = stockCodes.listIterator(currIndex);
    }
} finally {
    stockCodesReaderLock.unlock();
}

(B)

代码语言:javascript
复制
stockCodesReaderLock.lock();
try  {
    final int stockCodesSize = stockCodes.size();
    if (currIndex < stockCodesSize) {
        listIterator = stockCodes.listIterator(currIndex);
    }
} finally {
    stockCodesReaderLock.unlock();
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-01-12 02:28:35

其他受访者是对的:您应该始终使用,使用“尝试/最后”。

关于(A)或(B)是否正确,Sun似乎在JavaDoc of ReentrantReadWriteLock中推荐(B) (搜索“最终”以查看它)。我认为这是因为如果lock()方法失败,它可能会抛出一个异常:例如,JavaDoc表示它将在相同线程递归获取锁超过65535次的情况下抛出一个Error

票数 12
EN

Stack Overflow用户

发布于 2011-01-12 02:12:30

这是很好的防御性编程。如果您的代码发生了更改,因此无论出于任何原因(包括OutOfMemoryError),主体都会抛出一个异常,那么您将很高兴没有将锁留在卡住状态。

我个人支持(B) --如果lock()方法本身要抛出异常,那么它仍然是平衡的。但在实践中我不认为这有多重要。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4664717

复制
相关文章

相似问题

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