« Salut Amigo ! »

"Dans mes leçons précédentes, j'utilisais parfois les mots 'mutex' et 'moniteur', maintenant il est temps de vous dire ce qu'ils signifient."

"Je suis tout ouïe."

"Un mutex est un objet spécial pour synchroniser les threads/processus. Il a deux états possibles : occupé et libre. En termes simples, un mutex est une variable booléenne qui peut avoir deux valeurs : occupé (vrai) et libre (faux)."

"Lorsqu'un thread veut s'approprier un objet, il marque le mutex de l'objet comme occupé. Et lorsqu'il a fini de travailler avec l'objet, il marque son mutex comme libre."

"En d'autres termes, un mutex est comme un panneau 'occupé/libre' sur la porte ?"

"Oui. Et un tel mutex est associé à chaque objet en Java. Seule la machine Java a un accès direct au mutex. Il est caché au programmeur."

"Comment l'utilisons-nous alors ?"

"En Java, nous pouvons travailler avec un mutex via un moniteur."

"Un moniteur est un mécanisme spécial (morceau de code) superposé à un mutex. Il garantit une interaction correcte avec le mutex. Il ne suffit pas de marquer un objet comme étant occupé. Il est toujours nécessaire de s'assurer que d'autres threads n'essaient pas de utiliser l'objet occupé."

"En Java, les moniteurs sont implémentés à l'aide du mot-clé synchronized."

"Lorsque vous écrivez un bloc synchronisé, le compilateur Java le remplace par trois morceaux de code :"

1) Au début du bloc synchronisé, un code est ajouté qui marque le mutex comme occupé.

2)  À la fin du bloc synchronisé, un code est ajouté qui marque le mutex comme libre.

3)  Avant le bloc synchronisé, un code est ajouté qui, si le mutex est occupé, fait attendre le thread jusqu'à ce que le mutex soit libéré.

"Voici à peu près comment cela fonctionne :"

Code Comment ça fonctionne Description
synchronized(object)
{

object.doJob();

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

object.mutex = true;

object.doJob();

object.mutex = false;

Le thread dort tant que le mutex est occupé
(on sort de la boucle quand le mutex est relâché). Marquez le mutex comme occupé.

Exécutez doTask();

Marquer le mutex comme libre

"En réalité, la logique est différente et plus compliquée. Mais ce ne sont que des détails."

« Puis-je avoir les détails ? »

"Jusqu'à ce que vous appreniez à l'utiliser correctement, il ne sert à rien de s'emmêler dans les détails."

"Il y a quelques niveaux, je vous ai donné une liste de tous les états des threads avec des flèches de transition et une liste des méthodes qui affectent cet état. Vous en souvenez-vous ?"

"Pas vraiment. J'oublie tout si vite…"

"Moins vous pratiquez, moins vous bénéficiez de la théorie."

"Au niveau 40, vous apprendrez à utiliser tout cela, et je vous expliquerai comment tout cela fonctionne réellement. En attendant, apprenez simplement à tout utiliser correctement. Compris ?"

"Oui, merci Ellie."