Java supporta il multithreading a livello di sintassi del linguaggio, e tramite il sistema runtime. A livello di linguaggio, un thread è un oggetto della classe standard Thread, o di una sua sottoclasse, e possiede i metodi necessari a controllarne l'avvio, l'esecuzione, l'interruzione e lo stato. I metodi che sono dichiarati con la parola chiave synchronized non sono soggetti ad esecuzione concorrente, e cadono sotto il controllo dei monitor, che assicurano la consistenza dei valori delle variabili all'interno del metodo. Ogni classe ed ogni oggetto istanziato ha il suo proprio monitor, che viene attivato quando è necessario. I monitor di Java sono ``re-entrant'', il che significa che un metodo può acquisire lo stesso monitor più di una volta, in istanti successivi.
I metodi sincronizzati consentono di scrivere applicazioni ``thread-safe'', le cui funzioni, cioè, possono essere richiamate da più thread concorrenti, ma, fra questi, solo uno alla volta può accedere alle varabili di istanza.