In den meisten Programmiersprachen arbeitet man mit einzelnen sequentiellen Ausführungssträngen (single threaded).
Realistischer ist oft die Modellierung durch parallele Ausführungsstränge (multi threaded).
Arbeiten parallele Ausführungsstränge auf gemeinsamen Daten, entstehen zufällige Ergebnisse (race hazards) , wenn die Threads nicht bezüglich dieser Daten synchronisiert werden.
Java bietet die Mechanismen zur Programmierung paralleler Ausführungsstränge: