同期ブロックを使用しているときに「これ」を渡す必要があるのはなぜですか? 同期のパートナーの目的は何ですか?
5 に答える
Java同期ブロック構造は、括弧内のオブジェクトを取ります。「this」は、メソッドが呼び出されるインスタンスです。同期された構成によって括弧で囲まれたオブジェクトは、モニターオブジェクトと呼ばれます。コードは、モニターオブジェクトで同期されていると言われます。同期インスタンスメソッドは、それが属するオブジェクトをモニターオブジェクトとして使用します。
同じモニターオブジェクトで同期されたJavaコードブロック内で実行できるスレッドは1つだけです。
同期は指定したオブジェクトで実行されます。つまり、2つのスレッドが同じオブジェクトで同期する場合、一度にコードブロックを実行できるのは1つだけです。
多くの場合はですが、任意のオブジェクトにすることができますthis
。
これにより、たとえば、同じクラスの異なるオブジェクトで同期することができます。
synchronized
ロックオンするオブジェクトが必要だからです。this
は非常に便利Object lock = new Object()
ですlock
。
または、メソッドを としてマークすることもできますsynchronized
。
syntex はsynchronized(objectLock) { }
必ずしもthis
必要ではありません。複数のスレッドが同じ同期ブロックを実行しようとしている場合に排他的アクセスを許可するオブジェクトを渡す必要があります。このようにして、任意の時点で、2 つ以上のスレッドが同期ブロックのアクセスを試みた場合、渡されたオブジェクト (this
この場合は ' ') は、ブロックの実行が終了しない限り、ブロックの排他的アクセスを持ちます。そのブロックにアクセスできます。
Synchronize は、オブジェクト参照を使用して監視オブジェクトをロックします。同時アクセスから保護する各リソースには、独自のモニター オブジェクトが必要です。これを行う最も簡単な方法は、多くの場合、 を使用することthis
です。