Wenn ich zwei synchronisierte Methoden in derselben Klasse habe, aber alle auf unterschiedliche Variablen zugreifen, können 2 Threads gleichzeitig auf diese beiden Methoden zugreifen? Tritt die Sperre für das Objekt auf oder wird sie so spezifisch wie die Variablen in der synchronisierten Methode?Java synchronisierte Methodensperre für Objekt oder Methode?
Beispiel:
class X {
private int a;
private int b;
public synchronized void addA(){
a++;
}
public synchronized void addB(){
b++;
}
}
Can 2 Fäden die gleiche Instanz von Klasse X Zugriffs x.addA(
) und x.addB()
zugleich?
* Wenn Sie bei der Methode synchronisieren, sperren Sie das ganze Objekt, so dass zwei Threads, die auf eine andere Variable von demselben Objekt zugreifen, sich gegenseitig blockieren würden. * Das ist ein bisschen irreführend. Synchronisieren mit der Methode ist funktional äquivalent zu einem "synchronisierten" Block um den Körper der Methode herum. Das Objekt "this" wird nicht gesperrt, sondern das Objekt "this" wird als Mutex verwendet, und der Körper wird daran gehindert, gleichzeitig mit anderen Codeabschnitten zu arbeiten, die auch auf "this" synchronisiert sind. Es wirkt sich nicht auf andere Felder/Methoden von "this" aus, die nicht synchronisiert sind. –
Ja, es ist wirklich irreführend. Für ein echtes Beispiel - Sehen Sie sich das an - http://StackOverflow.com/questions/14447095/does-java-monitor-include-instance-variables - Zusammenfassung: Das Sperren erfolgt nur auf synchronisierter Methodenebene, und die Instanzvariablen des Objekts können von anderen zugegriffen werden Thread – mac
Das erste Beispiel ist grundlegend gebrochen. Wenn "a" und "b" Objekte waren, z. 'Integer's, Sie haben auf Instanzen synchronisiert, die Sie * mit anderen Objekten * ersetzen, wenn Sie den Operator' ++ 'anwenden. – Holger