Das Schlüsselwort synchronized ist der primäre Mechanismus zur Implementierung von Monitoren in Java.
Erklärung der Funktionsweise von synchronized in Java
Ein Monitor kann ein beliebiges Objekt sein. Wenn Code synchronisiert ist, wird er durch einen Monitor geschützt. Betritt ein Thread diesen Code, blockiert der Monitor alle anderen Threads, die gleichzeitig versuchen, darauf oder auf andere geschützte Teile desselben Monitors zuzugreifen. Erst wenn der Thread den Codeabschnitt wieder verlassen hat, wird der Monitor wieder geöffnet und der nächste Thread darf wieder hinein.
Als Block
public class Counter {
private long count = 0L;
// Ein Monitor kann ein beliebiges Objekt sein
private Object monitor = new Object();
public void add(long x) {
// Auf diesen Codeabschnitt kann nur ein Thread gleichzeitig zugreifen.
// Der Monitor kann auch noch für andere synchronized-Blöcke verwendet
// werden, dann kann ein Thread nur auf einen der Codeblöcke gleich-
// zeitig zugreifen.
synchronized (monitor) {
this.count = this.count + x;
}
}
}In Methoden
Das synchronized-Keyword kann auch für Methoden verwendet werden. Das ist einfach nur syntactic sugar, der die gesamte Methode in einen synchronized-Block wickelt der als Monitor-Objekt this verwendet.
public class Counter {
private long count = 0;
public synchronized void add(long x) {
this.count = this.count + x;
}
}ist gleichbedeutend wie:
public class Counter {
private long count = 0;
public void add(long x) {
synchronized (this) {
this.count = this.count + x;
}
}
}Nicht vergessen
Hat ein Objekt mehrere
synchronized-Methoden, haben (per definition) alle als Monitorthis. Hat der Monitor einem Thread Zugriff auf eine Methode gewährt, so ist ein gleichzeitiger Zugriff eines anderen Threads auch auf jede andere Methode gesperrt.