5

私はこれを見る:

// thread is a member of this class

synchronized( this.thread )
{
  this.thread.running = false;
  this.thread.notifyAll(); // Wake up anything that was .waiting() on
  // the thread
  this.thread = null;  // kill this thread reference.
  // can you do that in a synchronized block?
}

thread=nullロックしたまま設定しても大丈夫ですか?

このナゲットは、BB コードの一部で見つかりました。

4

5 に答える 5

7

はい、大丈夫です。同期ステートメントは、ロックしている参照のコピーを取得し、そのコピーを使用して、最後に何をロック解除するかを決定します。

Java 言語仕様のセクション 14.19は、これについて実際には明確ではありませんが式は最初に評価されると述べており、後で再度評価することについては言及していません。

于 2010-11-19T16:07:24.143 に答える
3

違いがあります:

synchronized( this.thread )

this.threadフィールドが指すオブジェクトで同期しています

this.thread = null;

フィールドを再割り当てしています。上で参照したオブジェクトに対して何も実行していないため、ロックは引き続き有効です。

于 2010-11-19T16:08:32.380 に答える
1

同期された式はエントリで逆参照されるため、このロックを後で使用すると NullPointerException が発生します。同期ブロックの前に null チェックを配置することで回避できますが、競合状態が発生します。

于 2010-11-19T17:57:09.107 に答える
0

スレッドに新しい値を割り当てるブロックもある場合にのみ問題が発生します。その場合、2 つのブロックが同じオブジェクトをロックしないため、競合状態が発生しますが、同じフィールドが更新され、どのブロックが最後に値を割り当てるかはランダムになります。

于 2010-11-19T17:53:56.550 に答える
0

あなたはそれを行うことができますが、達成しようとしているものに対してコードが間違っていることはほぼ確実です. コード全体を投稿してください。プログラマーが並行性を理解していないことは明らかです。

同期に使用される変数を再割り当てしないでください。

于 2010-11-19T17:15:42.510 に答える