Seit Java 1.0 können kritische Abschnitte mit synchronized geschützt werden. Im einfachsten Fall wird die gesamte Methode mit dem Modifizierer synchronized markiert. Ein betretender Thread setzt bei Objektfunktionen den Monitor des this-Objekts und bei statischen Methoden den Lock des dazugehörigen Class-Objekts.

Betritt die JVM die synchronisierte Methode, wird so lange gewartet, bis der Lock frei ist und dann die Methode betreten und abgeschlossen wird. Nach dem Verlassen wird der Lock wieder freigegeben. Damit hängt die Dauer des Locks mit der Dauer des Methodenaufrufs zusammen. Eine Endlosschleife in der synchronisierten Methode würde den Lock niemals freigeben.

Das aus !IPlusPlus.java bekannte Problem mit dem i++ lässt sich mit synchronized einfach lösen:

<verbatim>
synchronized void foo() { i++; }
</verbatim>

Bei einem Konflikt (mehrere Threads rufen foo() auf) verhindert synchronized, dass sich mehr als ein Thread gleichzeitig im kritischen Abschnitt, dem Rumpf der Methode foo(), befinden kann. Dies bezieht sich nur auf mehrere Aufrufe von foo() für dasselbe Objekt. Zwei verschiedene Threads können durchaus parallel die Methode foo() für unterschiedliche Objekte ausführen.

Für den kompletten Text, siehe (http://www.galileocomputing.de/openbook/javainsel6/javainsel_09_005.htm . )