x++
このコードを学生から入手しましたが、とが関与する競合状態のため、正しく動作しませんx--
。彼はこのバグを取り除こうとしてメソッドに追加synchronized
しましたが、明らかに、これはスレッドが同じオブジェクトに入るのを排除するだけで (これはそもそも問題ではありませんでした)、独立したオブジェクトが同じ静的変数を更新するのを妨げません。同時に。run()
run()
x
public class DataRace implements Runnable {
static volatile int x;
public synchronized void run() {
for (int i = 0; i < 10000; i++) {
x++;
x--;
}
}
public static void main(String[] args) throws Exception {
Thread [] threads = new Thread[100];
for (int i = 0; i < threads.length; i++)
threads[i] = new Thread(new DataRace());
for (int i = 0; i < threads.length; i++)
threads[i].start();
for (int i = 0; i < threads.length; i++)
threads[i].join();
System.out.println(x); // x not always 0!
}
}
で同期できないx
ため (原始的であるため)、私が考えることができる最善の解決策は、 のような新しい静的オブジェクトを作成し、ブロック内にandstatic String lock = "";
を囲み、をロックすることです。しかし、これは非常に厄介なようです。より良い方法はありますか?x++
x--
synchronized
lock