同期されたオブジェクトを呼び出した場合、そのオブジェクト内のオブジェクトに、同期されているかのようにアクセスできますか? または、データ型にのみアクセスできますか?
3 に答える
目標はデータを保護することですが、同期はデータの一部ではなく、コードのブロックに関する排他性を提供します。同期ブロックの外側 (または別のオブジェクトを使用するブロック内) のコードは、保護しようとしているデータを変更する可能性があります。
正しいロック戦略では、互いに干渉する可能性のあるコード ブロックが同じロックを保持するようにする必要があります。これには、2 番目のスレッドで実行される自身の別のコピーを妨害する可能性のあるコードが含まれます。
synchronized (myObject) {
// sensitive code
}
メソッド レベルでのロックは、メソッドthis
本体のポインターをロックするための簡単な方法です。(またはclass
静的メソッドのオブジェクト)。
すべてのオブジェクトに対する機能synchronize
は、混乱を招くため、Java でよく挙げられる煩わしさです。
基本的には、すべてのオブジェクトがロックになる可能性があるということです。それでおしまい。したがって、親オブジェクトをロックしてもオブジェクトのメンバーに特別な影響はなく、どの特定のオブジェクトをロックとして使用しても問題ありません。すべてのスレッドが同じオブジェクトをロックしている場合、そのうちの 1 つだけが同期ブロック内のコードを実行/アクセスします。それらのいくつかがそうでない場合、そのような保証はありません。
特定の時点で 1 つのスレッドのみがメンバーにアクセスするようにしたい場合は、そのメンバーにアクセスするすべてのスレッドが、アクセスする前に同じオブジェクトをロック (または「同期」) していることを確認してください。そうする限り、どのオブジェクトをロックに使用してもかまいません。
可能ですが、注意してください。これは、常に同じオブジェクトをロックする場合に実行できます。
ほとんどの場合、各オブジェクトをロックする必要があります。