„Hallo, Amigo!“

„In meinen vorherigen Lektionen habe ich manchmal die Wörter ‚Mutex‘ und ‚Monitor‘ verwendet, jetzt ist es an der Zeit, Ihnen zu erklären, was sie bedeuten.“

"Ich bin ganz Ohr."

„Ein Mutex ist ein spezielles Objekt zum Synchronisieren von Threads/Prozessen. Es hat zwei mögliche Zustände: beschäftigt und frei. Vereinfacht gesagt ist ein Mutex eine boolesche Variable, die zwei Werte haben kann: beschäftigt (wahr) und frei (falsch).“

„Wenn ein Thread den Besitz eines Objekts übernehmen möchte, markiert er den Mutex des Objekts als beschäftigt. Und wenn er mit der Arbeit mit dem Objekt fertig ist, markiert er seinen Mutex als frei.“

„Mit anderen Worten, ein Mutex ist wie ein ‚Besetzt/Frei‘-Schild an der Tür?“

„Ja. Und ein solcher Mutex ist jedem Objekt in Java zugeordnet. Nur die Java-Maschine hat direkten Zugriff auf den Mutex. Er bleibt dem Programmierer verborgen.“

„Wie nutzen wir es dann?“

„In Java können wir über einen Monitor mit einem Mutex arbeiten.“

„Ein Monitor ist ein spezieller Mechanismus (Codestück), der über einem Mutex liegt. Er garantiert die ordnungsgemäße Interaktion mit dem Mutex. Es reicht nicht aus, ein Objekt als beschäftigt zu markieren. Es muss dennoch sichergestellt werden, dass andere Threads dies nicht versuchen Verwenden Sie das Besetztobjekt.

„In Java werden Monitore mit dem Schlüsselwort synchronisiert implementiert.“

„Wenn Sie einen synchronisierten Block schreiben, ersetzt ihn der Java-Compiler durch drei Codeteile:“

1) Am Anfang des synchronisierten Blocks wird Code hinzugefügt, der den Mutex als beschäftigt markiert.

2)  Am Ende des synchronisierten Blocks wird Code hinzugefügt, der den Mutex als frei markiert.

3)  Vor dem synchronisierten Block wird Code hinzugefügt, der den Thread dazu veranlasst, zu warten, bis der Mutex freigegeben wird, wenn der Mutex beschäftigt ist.

„So funktioniert es ungefähr:“

Code Wie es funktioniert Beschreibung
synchronized(object)
{

object.doJob();

}
while (object.mutex)
Thread.sleep(1);

object.mutex = true;

object.doJob();

object.mutex = false;

Der Thread schläft, solange der Mutex beschäftigt ist
(wir verlassen die Schleife, wenn der Mutex freigegeben wird). Markieren Sie den Mutex als beschäftigt.

Führen Sie doTask();

Markieren Sie den Mutex als frei

„In Wirklichkeit ist die Logik dort eine andere und komplizierter. Aber das sind nur Details.“

„Kann ich die Einzelheiten haben?“

„Solange Sie nicht gelernt haben, wie man es richtig nutzt, hat es keinen Sinn, sich in Details zu verstricken.“

„Vor ein paar Ebenen habe ich Ihnen eine Liste aller Thread-Zustände mit Übergangspfeilen und eine Liste von Methoden gegeben, die diesen Zustand beeinflussen. Erinnern Sie sich an viel?“

„Eigentlich nicht. Ich vergesse einfach alles so schnell…“

„Je weniger Übung man macht, desto weniger profitiert man von der Theorie.“

„Ab Level 40 lernst du, wie man das alles nutzt, und ich erkläre dir, wie das alles tatsächlich funktioniert. In der Zwischenzeit lernst du einfach, alles richtig zu nutzen. Verstanden?“

„Ja, danke, Ellie.“