2

私はこの質問を好奇心のためだけに尋ねています、私はそのようなことをするのは愚かであることを知っています。

public void doSomething() 
{
      synchronized(object_A){
        count++;
        average = count/total;
      }
}

ここで、2つのスレッドを同時に実行しているとしましょう(関数doSomething()を呼び出します)。最初のスレッドがすでにブロックに入っているときに、たとえば「count ++」の行で、2番目のスレッドがブロックされてロックを待機しています。

object_A = new LockObject()今、私は(別のスレッドで)やろうとしています。では、スレッド1とスレッド2はどうなりますか?

スレッド2はブロックに入りますか?すでにステートメント「synchronized(object_A)」を実行しているので、ロックを変更するには遅すぎますか?

スレッド1は同期ブロックにいる間にロックを変更しますか(スレッド1がまだブロックにあると仮定します)?

4

2 に答える 2

1

イグニスが言ったようですが、スレッド2はすべての変数を更新する必要があるため、スレッド1が完了した後に新しい参照を参照します。

于 2012-10-31T11:30:24.563 に答える
0

唯一の問題はデータの整合性です。スレッドは異なるロックで同期され、ロックによって保護されているデータの値は正しくありません。ロックは、インスタンス初期化子のプライベート最終フィールドとして、またはクラスのコンストラクターで作成されます。

于 2012-10-31T12:22:28.783 に答える