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
}
}
これにより、ロックしている理由とロックしているものが非常に明確になります。