slideshareのスライド 15 に記載されている以下のコードが理解できません。
MyObject obj = new MyObject();
synchronized(obj) {
obj= new MyObject();
// no longer synchronizing on the same object
}
}
slideshareのスライド 15 に記載されている以下のコードが理解できません。
MyObject obj = new MyObject();
synchronized(obj) {
obj= new MyObject();
// no longer synchronizing on the same object
}
}
MyObject obj の最初の宣言で、「obj」オブジェクトが MyObject の新しいインスタンスに割り当てられています。
同期ブロックに入ると、java はそれ自体がロック オブジェクトとして使用するための「obj」への参照を保持します。
同期ブロック内で、プログラムが保持する参照が MyObject の別の新しいインスタンスに再定義されています。この時点で、MyObject の元のインスタンスを指す元の参照は失われ、MyObject の新しいインスタンスへの参照に置き換えられています。
'obj' を使用して発生する以降の同期ブロックは、オブジェクトの古いインスタンスではなく新しいインスタンスでロックされるため、同じオブジェクトで同期しなくなります。
このような問題を防ぐために、私は通常、偶発的な再定義を防ぐために、すべてのロック オブジェクトを final としてマークします。
実際には、1 行目と 2 行目で の新しいインスタンスを作成してMyObject
同期しています。
MyObject obj = new MyObject();
synchronized(obj) {
しかし、問題は、3 行目でobj
変数の値をオーバーライドして、新しいインスタンスの参照を割り当てることですMyObject
。その結果MyObject
、メモリ内に の 2 つのインスタンスが存在しますが、変数obj
は最後のインスタンスのみを参照します (これは同期されません)。