後世のためにもう少し情報を提供したいと思いました。
クラスで相互に排他的に呼び出しを行えるようにしたい。
したがって、クラスのインスタンスのロックについて話しているのか、クラスのすべてのインスタンスのロックについて話しているのかによって異なります。オブジェクトで同期しているときに、他のスレッドが同じオブジェクトインスタンスをロックすると、他のスレッドがブロックされます。
インスタンスメソッドがsynchronized
である場合、それはロックオンしている場合ですthis
。以下は同じです:
public void synchronized foo() {
...
}
と同じ:
public void foo() {
synchronized (this) {
...
}
}
通常、@ Tudorが言及しているように、メソッドを作成する代わりにロックオブジェクトの使用を検討する必要がありますsynchronized
。これにより、保護したい特定の線をロックすることができます。
クラスの同じインスタンスsynchronized
への他の呼び出しをブロックするインスタンスメソッド。代わりに、クラスのすべてのインスタンスをブロックする場合は、@ JimNが推奨することを実行し、静的メソッドを同期します。彼が言及しているように、それはクラスオブジェクトで同期することと同じです。
public static synchronized ReturnType methodName() {
何らかの理由ですべてのオブジェクトをロックする必要がある場合は、ロックをシングルトンでラップし、を使用していくつかのロック/ロック解除メソッドを記述しますReentrantLock
。