我们如何使用最后尝试Lock.lock和Lock.unlock

Che*_*eng 6 java

请考虑以下代码.为了防止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似乎在ReentrantReadWriteLockJavaDoc中推荐(B)(搜索"finally"来查看它).我想这是因为如果lock()方法失败,该方法可能会抛出异常:例如,JavaDoc表示它将Error在一个模糊的情况下抛出一个晦涩的情况,即同一个线程试图以递归方式获取锁定超过65535次.


Rap*_*ien 6

这是一个很好的防守编程.如果您的代码发生变化,以至于身体因任何原因(包括OutOfMemoryError)抛出异常,您会很高兴您没有将锁定置于卡住状态.

我个人会去(B) - 如果lock()方法本身是抛出异常,它仍然是平衡的.但在实践中,我认为这并不重要.