Threads et ressource partagée !
Bonjour,
voila, j'ai un peu du mal à me dépatouiller d'un problème de lecteur/écrivain pourtant tout bète... :scarymov:
Voici un bout de code qui recréé mon problème:
La classe ecrivain
Code:
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);
}
}
} |
La classe lecteur
Code:
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);
}
}
} |
Le Main
Code:
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();
}
} |
Et bien sur, l'erreur...
Code:
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... :pleure:
Pouvez vous me donner un coup de pouce ?
Merci d'avance.