PDA

View Full Version : [Java] sincronizzazione durante iterazione


71104
19-12-2006, 19:33
in un oggetto Vector le operazioni di aggiunta e rimozione di elementi sono atomiche; lo è anche una intera iterazione su tutti gli elementi fatta tramite un iterator? per esempio questa:

Vector<Integer> asd = ...;
for (Integer lol : asd) {
// ...
}

se durante il for un altro thread chiama per esempio la add che fa, aspetta o incasina tutto?

grazie

^TiGeRShArK^
19-12-2006, 20:04
in un oggetto Vector le operazioni di aggiunta e rimozione di elementi sono atomiche; lo è anche una intera iterazione su tutti gli elementi fatta tramite un iterator? per esempio questa:

Vector<Integer> asd = ...;
for (Integer lol : asd) {
// ...
}

se durante il for un altro thread chiama per esempio la add che fa, aspetta o incasina tutto?

grazie
mmm..
io penso proprio di no....
cmq spè ke vedo se trovo qualkosa x sicurezza :p

PGI-Bis
19-12-2006, 20:07
Va tutto a ramengo (quando uno è tecnico è tecnico :D).

Viene sparata una ConcurrentModificationException e il bello è che non è affatto "Concurrent". In pratica l'oggetto restituito da iterator() è usabile fintantochè non sia invocato un add (o qualsiasi metodo che comporti "mutazione strutturale") sul bersaglio dello scorrimento. A prescindere dal fatto che sia un altro Thread a produrre la mutazione.

PS.: butta l'occhio alla documentazione di java.util.Vector, l'inghippo è descritto nel quarto paragrafo.

^TiGeRShArK^
19-12-2006, 20:19
trovata :p
http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/CopyOnWriteArrayList.html

71104
19-12-2006, 20:47
Va tutto a ramengo (quando uno è tecnico è tecnico :D).

Viene sparata una ConcurrentModificationException... giusto...! :doh: :doh: :doh:

grazie entrambi ^^