次のコードを考えてみましょう。 listIterator
を呼び出している間にIndexOutOfBoundsException
を呼び出さないようにするには、リーダロックを使用してiteartorに基づくインデックスを取得し、ライターロック以外では、stockCodes
に書き込み操作を行います。Lock.lockとLock.unlockを試してみましょう
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();
}
[スレッド - なぜロックを試して最後に実行しなければならないのですか?](http://stackoverflow.com/questions/6950078/threads-why-a-lock-has-to-be-followed- by-try-and-finally) – Raedwald