クラスに同期メソッドと非同期メソッドがあり、同期メソッドのロックを取得するスレッドが 1 つあります。
私の質問は次のとおりです。この状況で、他のスレッドがクラスの非同期メソッドにアクセスできますか?
クラスに同期メソッドと非同期メソッドがあり、同期メソッドのロックを取得するスレッドが 1 つあります。
私の質問は次のとおりです。この状況で、他のスレッドがクラスの非同期メソッドにアクセスできますか?
はい。宣言されていない場合、メソッドは他のスレッドから引き続きアクセス可能ですsynchronized
ええ、他のスレッドは非同期メソッドにアクセスできますが、メソッドごとではなくオブジェクトごとに 1 つのロックしかないため、他のスレッドは他の同期メソッドにアクセスできないことに注意してください。
同期メソッドは、現在のインスタンスをモニター(ロック)として使用する同期ブロックの構文上のショートカットにすぎません。
public synchronized void abc() {
//something to do
}
と同等です
public void abc() {
synchronized(this) {
//something to do
}
}
同期されたブロックを実行するには、スレッドは最初に対応するモニターを取得する必要があります。この場合this
、これにより、同時にブロックを実行できるスレッドは1つだけになります。
現在、モニターとして使用されているという事実this
は、同期されたブロックの外側にあるものを保証するものではありません。this
つまり、オブジェクトに同期されていないメソッドが含まれている場合、実行中のスレッドがモニターを取得する必要がないため、複数のスレッドで同時に実行できます。