Nehmen Sie diesen Code:
public class MyClass {
private final Object _lock = new Object();
private final MyMutableClass _mutableObject = new MyMutableClass()
public void myMethod() {
synchronized(_lock) { // wir synchronisieren auf der Instanzvariable _lock
// mach etwas mit mutableVar
// (d.h. rufe eine "set"-Methode auf _mutableObject auf)
}
}
}
Stellen Sie sich nun vor, dass der Code in myMethod() an eine Hilfsklasse delegiert wird, der Sie das Schloss übergeben:
public class HelperClass {
public helperMethod(Object lockVar, MyMutableClass mutableVar) {
synchronized(lockVar) { // wir synchronisieren jetzt auf einem Methodenparameter,
// jeder Thread hat seine eigene Kopie
// mach etwas mit mutableVar
// (d.h. rufe eine "set"-Methode auf mutableVar auf)
}
}
}
Kann "myMethod" umgeschrieben werden, um die HelperClass zu verwenden, indem Sie ihr Schloss übergeben, damit alles weiterhin thread-sicher ist? d.h.,
public void myMethod() {
_helperObject.helperMethod(_lock, _mutableObject);
}
Ich bin mir nicht sicher, weil Java das lockVar per Wert übergibt und jeder Thread eine separate Kopie von lockVar erhält (obwohl jede Kopie auf dasselbe Objekt im Heap zeigt). Ich denke, die Frage kommt darauf an, wie das 'synchronized'-Schlüsselwort funktioniert - sperrt es die Variable oder den Wert im Heap, auf den die Variable verweist?