私は以下のスニペットのように見えるいくつかの(生産!)コードに走った:私は、これはすべての種類の対象となることを期待する(ジャワ)、そのオブジェクトに基づいて、同期ブロック内のオブジェクトの割り当て
synchronized(some_object) {
some_object = new some_object()
}
恐ろしい競争条件があり、2番目のスレッドが新しいオブジェクトが作成されたブロックに入る可能性があります。私のJavaのチョップは、上記の予想される動作を明確に述べるには十分ではないので、私がこれをリファクタリングする前に皆さんが言いたいことがあります。
これはあまり書かれていません。私の場合、クラスには、同期ブロックに使用される変数some_objectがあり、この変数は同じブロック内で再割り当てされています。 –
+1ここでキーとは、同期が参照ではなくオブジェクトを参照するということです。 'new'が実行されて割り当てられた後、あなたはまだ古いオブジェクトにロックされます。この時点で新しいオブジェクトはロックされません。同期化されたブロックが終了すると、古いオブジェクトのロックが解除され、他の参照が存在しない場合は、gcに適格です。実際の同期化されたブロックにもっと多くのコードがあり、それが何らかの形で新しいオブジェクトに転送されるロックに依存する場合、問題が発生する可能性があります。 –
ありがとうございました。ロックがオブジェクトにあり、リファレンスではないという事実は私には意味をなさない。私がぼやけていたのは、その変数によって参照されるオブジェクトが変更されたとき、別のスレッドが別のロックされていないオブジェクトを参照して再びブロックに入るか、同期ブロックの仕組みが起こるのを防ぐかでした。 –