J'ai 4 threads essayant chacun de trouver la valeur max dans une liste liée.Pourquoi ai-je besoin de synchroniser cette variable?
C'est ma classe de fil:
public class MyThread extends Thread {
LinkedList<Integer> list;
int max = Integer.MIN_VALUE;
public MyThread(LinkedList<Integer> list) {
this.list = list;
}
public void run() {
synchronized (list) { /* If I don't synchronize list, I get a NoSuchElementException at list.remove() */
while (!list.isEmpty()) {
int num = list.remove();
if (num > max) {
max = num;
}
}
}
}
}
Et voici la classe avec la méthode principale:
public class Application {
public static void main(String args[]) throws InterruptedException {
LinkedList<Integer> list = new LinkedList<Integer>();
for (int i = 0; i < 10; i++) {
list.add(i);
}
MyThread t1 = new MyThread(list);
MyThread t2 = new MyThread(list);
MyThread t3 = new MyThread(list);
MyThread t4 = new MyThread(list);
t1.start();
t2.start();
t3.start();
t4.start();
t1.join();
t2.join();
t3.join();
t4.join();
System.out.println(t1.max);
System.out.println(t2.max);
System.out.println(t3.max);
System.out.println(t4.max);
}
}
Dans le code ci-dessus, je dois synchroniser la variable list
dans la méthode d'exécution ou sinon je vais obtenir un NoSuchElementException
à list.remove()
. pourquoi est-ce le cas? Chaque thread ne possède-t-il pas sa propre liste, donc il n'y a pas d'interférence de thread?
Merci
Chaque constructeur 'MyThread' est appelé avec la même référence de liste, donc tous les threads utiliseront la même liste. – korolar
Étant donné que vous passez la 'List' dans chaque' Thread', pourquoi croiriez-vous que chacun a sa propre copie? –
[Lire la Javadoc] (https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html), en particulier le bit en gras qui indique "** Notez que cette implémentation n'est pas synchronisé. ** ". –