スレッド干渉シナリオを再現しようとしていますが、何かが正しくありません。私が何を理解するのを手伝ってください
主要
public static void main(String args[]) throws InterruptedException {
Counter c = new Counter();
for (int i = 0; i < 1000000; i++) {
new T1(c).start();
new T2(c).start();
}
System.out.println(c.value()); // <-- Expect this to sometimes not be 0
}
カウンター
class Counter {
private int c = 0;
public void increment() { // <-- intentionally not synchronized
c++;
}
public void decrement() { // <-- intentionally not synchronized
c--;
}
public int value() {
return c;
}
}
スレッド1
public class T1 extends Thread {
Counter c;
T1(Counter c) {
this.c = c;
}
public void start() {
c.decrement(); // <-- Decrement
}
}
スレッド2
public class T2 extends Thread {
Counter c;
T2(Counter c) {
this.c = c;
}
public void start() {
c.increment(); // <-- Increment
}
}
それぞれがコードの同期されていないセクションで動作している1000000スレッドを開始しているので、いくつかの操作が重複すると予想されます。
干渉は、異なるスレッドで実行されているが同じデータに作用する2つの操作がインターリーブするときに発生します。これは、2つの操作が複数のステップで構成されており、ステップのシーケンスが重複していることを意味します。
cに対する両方の操作は単一の単純なステートメントであるため、Counterのインスタンスに対する操作がインターリーブできないように見える場合があります。ただし、単純なステートメントでも、仮想マシンによって複数のステップに変換される可能性があります。仮想マシンが実行する特定の手順については説明しません。単一の式c++を3つの手順に分解できることを知っていれば十分です。
cの現在の値を取得します。取得した値を1ずつインクリメントします。インクリメントした値をcに戻します。
何が足りないのですか?