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 Monitor this. 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.