documentazione sul synchronizedList afferma che,Java lista sincronizzato per il ciclo
E 'indispensabile che l'utente sincronizzare manualmente nella lista restituita quando l'iterazione su di esso:
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
Iterator i = list.iterator(); // Must be in synchronized block
while (i.hasNext())
foo(i.next());
}
La mancata osservanza di questo consiglio può comportare un comportamento non deterministico.
Questo sembra abbastanza chiaro, ma volevo solo confermare che un ciclo per ogni ciclo è proibito. Ad esempio, non posso fare qualcosa come segue, giusto?
List<MyType> list = Collections.synchronizedList(new ArrayList(<MyType>));
...
synchronized(list){
for(MyType m : list){
foo(m);
m.doSomething();
}
}
Perché questo è proibito? Il codice byte generato è praticamente lo stesso. Foreach utilizza l'iteratore ... –
Sembra che la lista sincronizzata decida solo le chiamate al metodo con sincronizzazione, ma presenta delle limitazioni. Forse i progettisti dovrebbero aver decorato anche il metodo iteratore e restituire un iteratore sincronizzato. Il for è nella lingua e non può essere decorato così facilmente XD: –