A.class はグローバル ロックのように機能しますか?
どのsynchronized
ブロックも特定のオブジェクトをロックします。ロックは、実行中A.class
の の「グローバル」ロックとして機能します。これは、Javaが各ローダー ClassLoader
にオブジェクトのインスタンスが 1 つだけ存在することを保証するためです。はオブジェクトであるのと同じようにオブジェクトです。A.class
A.class
new 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 ドキュメントは次のとおりです。