Sto usando Collections.Synchronizedlist()
per rendere sicuro il thread arraylist
. Quello che voglio porre è il seguente codice thread-safe vale a dire rimuovere, mentre l'iterazione di lista dalla fine: -Collections.synchronizedlist() remove element while iterating dalla fine
pendingExecutionList = Collections.synchronizedList(new ArrayList<>(initialCapacity));
sto creando la lista nel thread principale. e aggiungendo a questa lista da diversi thread. Ma, iterazione e la rimozione è stato fatto solo da un unico filo programmato come segue: -
for (int i = pendingExecutionList.size() - 1; i >= 0; i--)
{
if (someCondition(pendingExecutionList.get(i)))
{
process(pendingExecutionList.remove(i));
}
}
Il codice precedente viene eseguito da un solo filo mentre più thread stanno aggiungendo a questa lista.
Voglio evitare di utilizzare iteratore su synchronized(list)
in quanto non è sicuro.
La risposta è disponibile all'indirizzo http://stackoverflow.com/questions/9468187/collections-synchronizedlist-and-synchronized – alphablue
No, non è thread-safe. [The javadoc] (http://docs.oracle. it/javase/8/docs/api/java/util/Collections.html # synchronizedList-java.util.List-) è estremamente chiaro al riguardo: * È imperativo che l'utente esegua manualmente la sincronizzazione sull'elenco restituito durante l'iterazione su di esso *. –
perché così? Puoi spiegare – maveroid