考虑以下代码。为了阻止IndexOutOfBoundsException
打电话时listIterator
,我们使用读取器锁来检索基于索引的迭代器,并在其他地方使用写入器锁进行写入操作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) or (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();
}
其他受访者是对的:你应该always使用尝试/最后。
关于(A)或(B)是否正确,Sun似乎在文章中推荐(B)ReentrantReadWriteLock的JavaDoc http://download.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html(搜索“终于”即可看到)。我想这是因为lock()
如果失败,方法可能会抛出异常:例如,JavaDoc 说它将抛出异常Error
在同一线程尝试递归获取锁超过 65535 次的模糊情况下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)