Bonjour,
voila, j'ai un peu du mal à me dépatouiller d'un problème de lecteur/écrivain pourtant tout bète...
Voici un bout de code qui recréé mon problème:
La classe ecrivain
La classe lecteur
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public class ecrivain extends Thread { ArrayList<Integer> L; int i = 0; public ecrivain(ArrayList<Integer> L){ this.L = L; } public void ecrire(){ L.add(i); i++; } public void run(){ while(true){ ecrire(); sleep(50); } } }
Le Main
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class lecteur extends Thread { ArrayList<Integer> L; public lecteur(ArrayList<Integer> L){ this.L = L; } public void lire(){ Iterator<Integer> it = L.iterator(); while(it.hasNext()){ System.out.print(it.next() + " "); } System.out.print("\n"); } public void run(){ while(true){ lire(); sleep(50); } } }
Et bien sur, l'erreur...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public class Main { public static void main(String[] args) { ArrayList<Integer> L = new ArrayList<Integer>(); ecrivain e = new ecrivain(L); lecteur l = new lecteur(L); e.start(); l.start(); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 0 1 2 3 4 5 6 7 8 9 Exception in thread "Thread-1" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(Unknown Source) at java.util.AbstractList$Itr.next(Unknown Source) at lecteur.lire(lecteur.java:16) at lecteur.run(lecteur.java:24)
Comme vous pouvez voir, çà marche au début, mais vers la 20ième itérations çà plante ! (bon là dans cet exemple c'était voulu mais pas dans mon projet...)
Après une 'tite recherche sur le net, j'ai collé des synchronized un peu partout sans aucun résultat...
Pouvez vous me donner un coup de pouce ?
Merci d'avance.
Partager