メソッド/フィールドが「this」で同期されているオブジェクトがあるとします。この質問は、実際には「これ」に関するものです。「これ」の参照が何を意味するのか、私は苦労していると思います。
したがって、私たちの目的は次のとおりです。
class A {
private Field a;
private Field b;
public synchronized void doSomething() {
//something with a
}
public synchronized void somethingElse() {
//do something as with b
}
}
次に、A オブジェクトを受け取り、doSomething および somethingElse メソッドを介して a および b を処理する別のオブジェクトまたはメソッドがあります。したがって、A オブジェクトを処理している間は状態の一貫性を保つ必要があるため、同期します。これらの A オブジェクトが Map の値であるとしましょう。次に、値を繰り返し処理し、自分が行うことを実行します。したがって、問題は、次の方法で実行するのがスレッドセーフかどうかです。
for(A aObject : map.values()) {
synchronized(aObject) {
aObject.doSomething();
aObject.somethingElse();
}
}
「this」の参照がaObjectと同じ参照であれば問題ないと思います。しかし、次のようにするとどうなりますか。
for(A aObject : map.values()) {
A anotherReference = aObject;
synchronized(anotherReference) {
anotherReference.doSomething();
anotherReference.somethingElse();
}
}
まだスレッドセーフですか?つまり、ロック参照のローカル コピーを同期できますか?
注: これは、コードで行う必要があることを単純化しすぎています。