私は、この変数にvolatileキーワードを使用していないときに、たびに共通の変数 "n" 、私は理解できない何かが起こる、SB説明が助けてください、スニペットは次のようなものです:JAVAのスレッド間で変数を共有する
public class TwoThreads {
private static int n = 0;
private static int called = 0;
public static void main(String[] args) {
for (int i = 0; i < 1000; i++) {
n = 0;
called = 0;
TwoThreads two = new TwoThreads();
Inc inc = two.new Inc();
Dec dec = two.new Dec();
Thread t = new Thread(inc);
t.start();
t = new Thread(dec);
t.start();
while (called != 2) {
//System.out.println("----");
}
System.out.println(n);
}
}
private synchronized void inc() {
n++;
called++;
}
private synchronized void dec() {
n--;
called++;
}
class Inc implements Runnable {
@Override
public void run() {
inc();
}
}
class Dec implements Runnable {
@Override
public void run() {
dec();
}
}
}
1)私は、実行後の "n = 0、= 2と呼ばれる" されて期待していますどのような、しかし、メインスレッドはwhileループでブロックされる可能性があります。
2)しかし、私はこの行、予想通りにプログラムコメントを解除する場合:
//System.out.println("----");
3)私は「と呼ばれる」オン「揮発性」を使用する必要があります知っているが、上記のはなぜ起こるか私が説明することはできませんが。
4)「呼び出された」とは、特定のスレッドの作業メモリで「読み込みと読み込み」ですが、「長い」ループの後にメインスレッドに「ストアアンドライト」しないのはなぜですか? print "行はそのような違いを生む可能性があります。
print()の代わりにThread.sleep()メソッドを使用しても同じ効果が得られると思います。 –
@victorあなたは正しいです、どんな行でも同じ効果があります、理由を説明できません –
あなたはスレッドが実行されているときは制御しません。メインは実行を継続し、終了するまでにもう一方のスレッドも終了します。そのため、スレッドの残りの部分が完了するまで、Thread.join()を使用してメインを停止する必要があります。 (Thread.sleep()は時間がかかりますが、join()はfinnishまで待機します) –