Classと同期には違いがありinstanceます。
インスタンスの同期は の各インスタンスで機能するObjectため、コードは次のようになります。
public synchronized void putInCache() {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
そしてコード
public void putInCache() {
synchronized(this) {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
}
複数のスレッドが同時に同期ブロックに入ることを許可しないという点で同等です。ただし、これはクラスの各インスタンスのみです。つまり、モニターはオンですthis
クラス同期はClassそれ自体で機能し、次の 2 つのブロックも同等です。
public static synchronized void putInCache() {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
public void putInCache() {
synchronized(MyClass.class) {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
}
JVM 全体で複数のスレッドが同期ブロックに同時に入ることはまったく許可されません。つまり、モニターはClassインスタンス上にあり、一意です。
Class同期を使用する必要があります。
別の方法は、同時アクセスを防止しようとしているリソース自体をロックすることです。リソースをnullにすることはできず、リソースのインスタンスがランダムに変更されない場合-finalこれを行うことができればさらに良いです:
public void putInCache() {
synchronized(cache) {
// ... do some stuff
cache.insert(this);
// ... do some more stuff
}
}
これにより、ロックしている理由とロックしているものが非常に明確になります。