Aller au contenu

[Java]Problème de synchronisation


windu.2b

Messages recommandés

Bonjour,

J'ai un problème de synchronisation dans mon code. J'ai une List qui contient des éléments à dessiner, ces éléments pouvant être ajoutés et supprimés.

et j'ai une méthode paintBuffer() qui se charge d'appeler chaque élément de cette List pour leur demander de se dessiner. Et comme par "hasard", ça chie dans la colle ! Je me ramasse une "java.util.ConcurrentModificationException" lors de l'itération alors que j'utilise des 'synchronized'.

Voici le code, que vous voyiez de quoi je parle :

private List<Drawable> listElements = Collections.synchronizedList( new ArrayList<Drawable>() );

public void add( Drawable drawableElement )

{

synchronized ( listElements )

{

listElements.add( drawableElement );

}

}

public void remove( Drawable drawable )

{

synchronized ( listElements )

{

listElements.remove( drawable );

}

}

public void paintBuffer( Graphics g )

{

synchronized ( listElements )

{

Iterator<Drawable> it = listElements.iterator();

while( it.hasNext() )

{

( ( Drawable ) it.next() ).paintBuffer( g );

}

}

}

Et voici la pile d'exceptions qui est levée :

Exception liée au thread principal : java.util.ConcurrentModificationException

java.util.ConcurrentModificationException

at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:449)

at java.util.AbstractList$Itr.next(AbstractList.java:420)

at shmup.model.Jeu.paintBuffer(Jeu.java:196)

at shmup.graphics.GameZone.paintBuffer(GameZone.java:100)

at shmup.graphics.JGame$1.run(JGame.java:145)

La ligne 196 de Jeu.java étant la ligne dans le while() de la méthode paintBuffer

Merci

Lien vers le commentaire
Partager sur d’autres sites

je crois me souvenir que les iterateurs sont non-synchronizés en java, donc si tu veux modifier une list de manière synchrone, il faut utiliser des getter/setter et pas un itérateur. ;)

Sentinel, toi qui est notre dieu vivant du java ici, peux-tu confirmer ? ;):love::smack::yes:

:transpi:

(oula, j'ai une tita-ite aigüe, ce soir... :p :p :transpi: )

Lien vers le commentaire
Partager sur d’autres sites

Ben, on en a déjà discuté par MSN cet après-midi... Et à priori sa synchro est correcte (y'a même des trucs en trop, mais c'est pas grave).

Il a synchronisé sur le lock de sa liste, ce qui fait que, normalement, pendant qu'il la parcourt avec son itérateur, il est impossible de la modifier via les méthodes add() et remove() visibles dans son code.

A mon avis donc, ça ne vient pas du code montré ici (mais tout le monde peut se tromper hein :transpi:)

Lien vers le commentaire
Partager sur d’autres sites

  • 1 mois après...

Je ne suis pas bien sur de comprendre le besoin.

En gros, t as un iterator qui contient des objets de type Drawable et tu veux qu'ils s'affichent tous en même temps?

L'utilisation des threads et particulierement des synchronized en java n est pas recommande a moins de savoir parfaitement ce qu on fait, ce qui est le cqs de 5% des programmeurs.

Plutot que d'utiliser un bordel pareil, pourquoi tout simplement ne pas se demerder pour creer une liste ou une enumeration qui te permettrait de tout affiche et de faire juste un .setVisible(true) une fois que tout est en cache?

T as un besoin vital de perfs? Tu programmes un jeu? Parce que vu les machines actuelles et connaissant les perfs de la jvm 1.6 (eh oui, java est devenu performant en moins de dix ans), il est rare de se retrouver a devoir optimiser au taquet a part sur les gros systemes en ligne.

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...