2
// In Thread1  
x=5;  
synchronization(obj)  
{  
    // do something (no operations involving x)  
}

// In thread 2  
synchronization(obj)  
{  
    // do something(operations involving x)  
}

そのブロックに入る前に、JVMが同期ブロックの前にすべてのステートメントを最初に実行する必要があるという要件はありますか? Thread-1 では、同期ブロックには関係する操作がないため、x最初に同期ブロックを実行し、次に代入操作を実行できますx=5

そして、スレッド 2 はx、その同期ブロック内の の値を参照します。オブジェクトが作成されたときに、最初に Thread-1 が実行され、次に Thread-2 が実行され、両方が同じオブジェクトで実行されているとしますx = 0

スレッド 1 の同期ブロックは、スレッド 2 の同期ブロックの前に発生すると言えます。xでは、その同期ブロック内のスレッド 2の値はどうあるべきでしょうか?

4

4 に答える 4

3

そのブロックに入る前に、同期されたブロックの前にjvmが最初にすべてのステートメントを実行する必要があるという要件はありますか?

はい。http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html言います:

スレッド内の各アクションは、プログラムの順序で後で来るそのスレッド内のすべてのアクションの前に発生します。

x への割り当てが最初の同期ブロックの実行のに発生し、最初の同期ブロックの実行が 2 番目の同期ブロックの実行の前に発生するとすると、最初のスレッドで x に割り当てられた値は 2 番目のスレッドから見えるようになります。(事前発生は推移的です)。

于 2012-05-03T15:46:10.087 に答える
0

スレッド 2 では、x次のようなことが考えられます。

  • 0、スレッド 2 の同期ブロックが前x = 5に実行された場合 (実際にはその後に実行された可能性もありますが、以前にキャッシュされた値 0 を持っているため、更新する義務はありません。x = 5スレッド 2 とスレッド 2 の間に事前発生エッジがないためです)
  • 5、スレッド 2 の同期ブロックがスレッド 1 のブロックx = 5の前に実行された (そしてたまたまその値がフラッシュされた) 場合synchronized
  • Thread-1のsynchronizedブロックが割り当てる値は何でもx(あなたの場合は起こらないので、このオプションはアウトです)
  • これらの型内の単語はアトミックに更新する必要がないため、xが alongまたはの場合は、まったく別の値です。double( jls 17.7を参照)。この特定のケースでは、「その他の値全体」は 0 または 5 になることに注意してください (longそれぞれ、 の上半分または下半分しか表示されていない場合)。ただし、両方の単語に 0 以外の値がある場合は、これらの単語の潜在的な値の任意の組み合わせを確認できます。

Thread-1 では、JB Nizet が指摘しているように、スレッド内のセマンティクスはx、初期化されていない 0 として表示されないことを意味します。それは 5 か、Thread-2 が設定した値 (もちろん 0 になる可能性があります) のいずれかになります。 .

于 2012-05-03T16:00:25.367 に答える
0
  1. 1 つのスレッド内のすべてのステートメントは、順次実行されます。

  2. 2番目の質問で説明しているのは、競合状態です。スレッド #1 は、同期ブロックの外側で x に値を代入しています。実行の順序に応じて、スレッド #2 は x = 0 または x = 5 を認識できます。

  3. 3 番目の仮定では、x は 5 に等しくなります。

于 2012-05-03T16:03:24.707 に答える
0

xの変更が に表示されるようにするにはどうすればよいですThread 2か?

xThread 1同期ブロックになく、あなたはそれを作成しなかったと思いますvolatile。そのため、以前にx割り当てが行われたとしても、 の古い値を読み取る可能性があります。Thread 2Thread 2x

于 2013-01-21T01:07:36.147 に答える