Si consideri il seguente codice. Per impedire listIterator
durante la chiamata a listIterator
, viene utilizzato un blocco lettore per recuperare l'indicatore basato su indice e il blocco scrittore su altro quando si esegue un'operazione di scrittura su stockCodes
.Come useremo provare finalmente per Lock.lock e Lock.unlock
Prendere atto che, non abbiamo utilizzato alcun meccanismo di blocco per iterare utilizzando listIterator
, come è da CopyOnWriteArrayList
. Il blocco non è richiesto poiché ConcurrentModificationException
non deve essere lanciato.
// 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();
mi chiedevo, se devo avere try/finally
blocco, come non riesco a vedere alcuna possibilità di deroga a sorgere? Se si utilizza lo standard try/finally
, è necessario utilizzare (A) o (B)?
C'è bisogno di me?
(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();
}
possibile duplicato di [Thread: Perché un blocco deve essere seguito da try e finally] (http://stackoverflow.com/questions/6950078/threads-why-a-lock-has-to-be-followed- by-try-and-finally) – Raedwald