A.class はグローバル ロックのように機能しますか?
どのsynchronizedブロックも特定のオブジェクトをロックします。ロックは、実行中A.classの の「グローバル」ロックとして機能します。これは、Javaが各ローダー ClassLoaderにオブジェクトのインスタンスが 1 つだけ存在することを保証するためです。はオブジェクトであるのと同じようにオブジェクトです。A.classA.classnew A()
ロックするA.classことは、静的メソッドをロックすることと同じです。
public class A {
public static synchronized void someStaticMethod() {
// in here you are locked on A.class as well
}
public void doSomething() {
synchronized (A.class) {
// this block is locked on the same object as someStaticMethod()
}
}
}
比較のために、(静的メソッドではなく) インスタンス メソッドをロックすると、実行中のインスタンスをロックするのと同じことになりますA。言い換えればthis:
public class A {
public synchronized void someInstanceMethod() {
// in here you are locked on the instance of A (this)
}
public void doSomething() {
synchronized (this) {
// this block is locked on the same instance of A
}
}
}
繰り返しますが、それは問題の特定のオブジェクトに関するものです。ロックに関する Java ドキュメントは次のとおりです。