リンクリストの最大値を見つけるために4つのスレッドがあります。なぜこの変数を同期させる必要がありますか
これは私のスレッドクラスです:
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;
}
}
}
}
}
そしてここでは、mainメソッドを持つクラスである:上記のコードで
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);
}
}
、私はrunメソッド内list
変数を同期化する必要がありますそうでなければNoSuchElementException
をlist.remove()
にします。これはなぜですか?
各スレッドには独自のリストがありませんので、スレッドの干渉はありませんか?
ありがとうございます。
各 'MyThread'コンストラクタは同じリスト参照で呼び出されるので、すべてのスレッドは同じリストを使用します。 – korolar
'List'をすべての' Thread'に渡すと、なぜあなたはそれぞれに独自のコピーがあると思いますか? –
[Javadocを読む](https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html)、特に太字で「**この実装は同期**。 –