gpt4 book ai didi

java - 我们如何将 try finally 用于 Lock.lock 和 Lock.unlock

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:45:09 28 4
gpt4 key购买 nike

考虑以下代码。为了防止IndexOutOfBoundsException打电话时 listIterator ,我们使用读取器锁来检索基于索引的 iteartor,并在对 stockCodes 进行写操作时使用写入器锁.

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

// 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)

try {
stockCodesReaderLock.lock();
final int stockCodesSize = stockCodes.size();
if (currIndex < stockCodesSize) {
listIterator = stockCodes.listIterator(currIndex);
}
} finally {
stockCodesReaderLock.unlock();
}

(B)

stockCodesReaderLock.lock();
try {
final int stockCodesSize = stockCodes.size();
if (currIndex < stockCodesSize) {
listIterator = stockCodes.listIterator(currIndex);
}
} finally {
stockCodesReaderLock.unlock();
}

最佳答案

其他受访者是对的:您应该始终使用 try/finally。

关于(A)或(B)是否正确,Sun在JavaDoc of ReentrantReadWriteLock中似乎推荐(B) (搜索“finally”即可看到)。我想这是因为 lock() 方法如果失败可能会抛出异常:例如,JavaDoc 说它会在相同的模糊情况下抛出 Error线程尝试递归获取锁超过 65535 次。

关于java - 我们如何将 try finally 用于 Lock.lock 和 Lock.unlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4664717/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com