Javaの同期メソッドがどのように機能するかを知っています。
クラスに3つの同期されたメソッドがあるとします。スレッドが使用可能なメソッドの1つにアクセスすると、他の2つは他のスレッドに対してブロックされます。
1つのメソッドの同期実装を次のように変更した場合:
synchronized (this) {...}
それでも同じように機能し、他の2つの方法をブロックしますか?
Javaの同期メソッドがどのように機能するかを知っています。
クラスに3つの同期されたメソッドがあるとします。スレッドが使用可能なメソッドの1つにアクセスすると、他の2つは他のスレッドに対してブロックされます。
1つのメソッドの同期実装を次のように変更した場合:
synchronized (this) {...}
それでも同じように機能し、他の2つの方法をブロックしますか?
これは、Javaチュートリアルのセクション「固有のロックと同期」(強調私のもの)で説明されています。
スレッドが同期メソッドを呼び出すと、スレッドはそのメソッドのオブジェクトの組み込みロックを自動的に取得し、メソッドが戻ったときにそれを解放します。キャッチされなかった例外が原因でリターンが発生した場合でも、ロック解除が発生します。
だから、答えはイエスです。
はい。
synchronized
キーワードをメソッドに適用すると、メソッドの内容をでラップするのと同じですsynchronized(this)
。
仕様によると:
同期メソッドは、実行前にモニター(§17.1)を取得します。
クラス(静的)メソッドの場合、メソッドのクラスのClassオブジェクトに関連付けられたモニターが使用されます。
インスタンスメソッドの場合、これに関連付けられたモニター(メソッドが呼び出されたオブジェクト)が使用されます。
はい、そうです。
public synchronized void method() {...}
オブジェクトの固有のロック(this
)を使用するため、そのロックを使用する他の同期ブロックは次のようになります。
synchronized(this) {...}
ロックがすでに保持されている場合はブロックします。
this
注:メソッドが静的である場合、ロックはもうないため、画像は異なりYourObject.class
ます。以下の例では、2つのセクションが同じロックを使用していないため、method
別のスレッドT2の実行中にスレッドT1の実行を妨げるものはありません。someOtherMethod
public static synchronized void method() {...}
public void someOtherMethod() {
synchronized(this) {
}
}