请考虑以下代码.为了防止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();
Run Code Online (Sandbox Code Playgroud)
我想知道,我是否应该try/finally阻止,因为我看不出有任何异常出现的机会?如果try/finally必须使用,我应该使用(A)还是(B)?
我有什么需要吗?
(一个)
try {
stockCodesReaderLock.lock();
final int stockCodesSize = stockCodes.size();
if (currIndex < stockCodesSize) {
listIterator = stockCodes.listIterator(currIndex);
}
} finally {
stockCodesReaderLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
(B)
stockCodesReaderLock.lock();
try {
final int stockCodesSize = stockCodes.size();
if (currIndex < stockCodesSize) {
listIterator = stockCodes.listIterator(currIndex);
}
} finally {
stockCodesReaderLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
Dan*_* R. 11
其他受访者是对的:你应该总是使用try/finally.
关于(A)或(B)是否正确,Sun似乎在ReentrantReadWriteLock的JavaDoc中推荐(B)(搜索"finally"来查看它).我想这是因为如果lock()方法失败,该方法可能会抛出异常:例如,JavaDoc表示它将Error在一个模糊的情况下抛出一个晦涩的情况,即同一个线程试图以递归方式获取锁定超过65535次.
这是一个很好的防守编程.如果您的代码发生变化,以至于身体因任何原因(包括OutOfMemoryError)抛出异常,您会很高兴您没有将锁定置于卡住状态.
我个人会去(B) - 如果lock()方法本身是抛出异常,它仍然是平衡的.但在实践中,我认为这并不重要.
| 归档时间: |
|
| 查看次数: |
5521 次 |
| 最近记录: |