请考虑以下代码.为了防止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) ReentrantReadWriteLock.ReadLock
ReentrantReadWriteLock.WriteLock
Run Code Online (Sandbox Code Playgroud)
对于上述两个类,我是否像这样调用锁
try {
readLock.tryLock(10, TimeUnit.SECONDS)
[...]
} finally {
readLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
或者
readLock.tryLock(10, TimeUnit.SECONDS)
try {
[...]
} finally {
readLock.unlock();
}
Run Code Online (Sandbox Code Playgroud)
哪个更安全,同样适用于lock()方法还是tryLock()方法?