Moniteur (programmation)
# Moniteur (programmation)

Un moniteur est une approche pour synchroniser deux ou plusieurs tâches qui utilisent des ressources partagées, habituellement des appareils séparés (imprimantes) ou des ensembles de variables.

Autrefois, les systèmes d'exploitation se réduisaient à un simple programme moniteur enchainant l'exécution des autres (par exemple le DOS de l'IBM 360 à la fin des années 1960). Ce sens est aujourd'hui inusité et n'a rien à voir avec le sens actuel (synchronisation).

## Exclusion mutuelle

Un moniteur est constitué de :

* un ensemble de procédures permettant l'interaction avec la ressource partagée ;
* un verrou d'exclusion mutuelle ;
* des variables associées à la ressource ;
* un moniteur non variable qui définit les prétentions nécessaires à l'obtention des conditions.

## Exemples d'utilisation des moniteurs en Java

Soient deux thread qui souhaitent communiquer entre eux. Le premier thread envoie des messages au deuxième thread par l'intermédiaire d'une file. Si la file est vide, alors le deuxième thread doit se mettre en attente d'un nouveau message. Une telle file peut être implémentée à l'aide du code suivant :

* import java.util.*;
* public class EchangeMessage {
* private ArrayList l = new ArrayList;
* public void enfiler(Object o) {
* l.add(o);
* if(l.size==1) {
* try {
* this.notify;
* } catch (IllegalMonitorStateException e)
* public Object defiler {
* if(l.size==0) {
* try {
* this.wait;
* } catch (InterruptedException e)
* Object o = l.get(0);
* l.remove(0);
* return o;
* public synchronized boolean vide {
* return l.isEmpty;
* Cette classe utilise trois méthodes.
* La méthode enfiler ajoute une donnée dans la file et si la file était vide avant, alors elle libère une éventuelle tâche qui attendrait.
* La méthode defiler lit une valeur depuis la file. Si aucune donnée n'est disponible, elle se met en attente.
* La méthode vide permet de savoir si la file est vide.
* Il est possible de faire les remarques suivantes concernant le fonctionnement de Java par rapport à cet exemple :
* Les moniteurs en Java n'ont pas un fonctionnement FIFO. Cela signifie que ce n'est pas forcément la tâche qui attend depuis le plus longtemps qui sera réveillée en premier.
* Les moniteurs doivent être utilisés dans des blocs synchronisés. Le verrou associé à la synchronisation est implicitement rendu lors de la mise en attente et est automatiquement récupéré lorsque la tâche est réveillée.
