PDA

View Full Version : [JAVA]problema concorrenza (inesistente) su HashSet


morskott
03-11-2007, 18:20
Chi mi risolve (e possibilmente spiega) questo problema ha una pizza pagata (in caso di spiegazione offro pure birra)!!!!!
Scherzi a parte ho un HashSet che scandisco regolarmente con un foreachSet<Corso> corsiDisponibili=ipcuc.visualizzaCorsiSeguiti(studente);
for (Corso corso:corsiDisponibili){
//BLHA
}, unica istanza di corsiDisponibili acceduta dall'unico thread di esecuzione, con queste premesse come mai al foreach si lancia una "ConcurrentModificationException"??????
Attendo lumi!!!

71104
03-11-2007, 18:46
il problema è che gli iterators usano un meccanismo di "fail fast", come lo chiamano alla Sun, cioè un meccanismo estremamente approssimativo :D
vale a dire che la sedicente ConcurrentModificationException in realtà in buona parte dei casi concurrent non è.

il meccanismo funziona nella seguente maniera: quando iteri tramite un iterator l'unica modifica che puoi fare ad una Collection è la rimozione dell'elemento su cui stai attualmente iterando, e lo devi fare necessariamente tramite il metodo remove dell'iterator. se all'iterazione successiva l'iterator si accorge che la Collection è stata modificata, e non per mano sua, da' per scontato che la modifica sia "concorrente", ovvero che l'abbia fatto un altro thread mal sincronizzato, e lancia l'eccezione.

vedo che il tuo codice utilizza un enhanced for: per modificare la Collection su cui iteri tramite iterator devi avere l'istanza dell'iterator, quindi non puoi iterare con l'enhanced for.

71104
03-11-2007, 18:47
Chi mi risolve (e possibilmente spiega) questo problema ha una pizza pagata (in caso di spiegazione offro pure birra)!!!!! LOL? di dove sei? :D
asd

morskott
03-11-2007, 18:56
il problema è che gli iterators usano un meccanismo di "fail fast", come lo chiamano alla Sun, cioè un meccanismo estremamente approssimativo :D
vale a dire che la sedicente ConcurrentModificationException in realtà in buona parte dei casi concurrent non è.

il meccanismo funziona nella seguente maniera: quando iteri tramite un iterator l'unica modifica che puoi fare ad una Collection è la rimozione dell'elemento su cui stai attualmente iterando, e lo devi fare necessariamente tramite il metodo remove dell'iterator. se all'iterazione successiva l'iterator si accorge che la Collection è stata modificata, e non per mano sua, da' per scontato che la modifica sia "concorrente", ovvero che l'abbia fatto un altro thread mal sincronizzato, e lancia l'eccezione.

vedo che il tuo codice utilizza un enhanced for: per modificare la Collection su cui iteri tramite iterator devi avere l'istanza dell'iterator, quindi non puoi iterare con l'enhanced for.

Perfetto, sei il mio nuovo mito personale, adesso funzia come dovrebbe, quando vuoi hai pizza+birra

PS: son di origini napoletane, perchè?

cionci
03-11-2007, 20:05
PS: son di origini napoletane, perchè?
Credo per venire a ritirare la pizza :asd:

71104
04-11-2007, 09:04
Credo per venire a ritirare la pizza :asd:
esatto :D

mannaggia, io sono di Roma; e dire che la pizza napoletana era pure buona... :D

morskott
04-11-2007, 09:46
Certo pure stupidini quelli della sun, perchè implemntare il foreach solo per Collections immutabili...

71104
04-11-2007, 09:49
Certo pure stupidini quelli della sun, perchè implemntare il foreach solo per Collections immutabili... non sono immutabili, le puoi modificare solo che le modifiche che puoi fare sono limitate alla sola rimozione dell'elemento su cui stai iterando, cosa che va fatta tramite il metodo remove dell'iterator.