90 votes

Quelle est la signification du moniteur d'un objet en Java ? Pourquoi utiliser ce mot ?

En lisant des articles sur les threads Java, je remarque souvent l'expression : "current thread is the owner of this object's monitor". J'en comprends le sens : le thread a le droit d'opérer sur l'objet. Mais je me demande pourquoi nous utilisons l'expression "le moniteur de l'objet" au lieu de "le verrou de l'objet" ?

En bref, je ne connais pas le sens du mot "moniteur La question est peut-être étrange et simple. Mais j'espère que quelqu'un pourra m'aider à la résoudre. 3ks

1 votes

+1 @ulmangt pour avoir été le seul à répondre à votre question : Nous les appelons "moniteurs" parce que c'est ainsi que Hoare les appelait en 1974.

54voto

Stephen C Points 255558

Mais je me demande pourquoi utiliser le mot "moniteur de l'objet" au lieu de "verrou de l'objet" ?

Voir la réponse d'ulmangt pour des liens qui expliquent le terme "moniteur" tel qu'il est utilisé dans ce contexte. Notez que :

"Les moniteurs ont été inventés par Per Brinch Hansen et C. A. R. Hoare, et ont été mis en œuvre pour la première fois dans le langage Concurrent Pascal de Brinch Hansen.

(Source : Wikipedia (en anglais) )

Pourquoi utiliser le terme "moniteur" plutôt que "serrure" ? À proprement parler, ces termes ont des significations différentes... surtout si vous les utilisez de la manière dont ils étaient censés être utilisés à l'origine.

  • Un "verrou" est quelque chose avec des primitives d'acquisition et de libération qui maintiennent certaines propriétés de verrouillage ; par exemple, l'utilisation exclusive ou un seul écrivain / plusieurs lecteurs.

  • Un "moniteur" est un mécanisme qui garantit qu'un seul thread peut exécuter une (ou plusieurs) section(s) donnée(s) du code à un moment donné. Ce mécanisme peut être mis en œuvre à l'aide d'un verrou (et de "variables de condition" qui permettent aux threads d'attendre ou d'envoyer des notifications à d'autres threads lorsque la condition est remplie), mais il s'agit de bien plus qu'un simple verrou. En effet, dans le cas de Java, le verrou utilisé par un moniteur n'est pas directement accessible. (Vous ne pouvez pas dire "Object.lock()" pour empêcher d'autres threads de l'acquérir ... comme vous pouvez le faire avec un verrou Java Lock instance.)

En bref, si l'on veut être pédant, "monitor" est en fait un meilleur terme que "lock" pour caractériser ce que Java fournit. Mais dans la pratique, les deux termes sont utilisés de manière presque interchangeable.

23voto

ulmangt Points 3148

Un moniteur est simplement un objet dont les méthodes peuvent être utilisées en toute sécurité dans un environnement multithread.

Il existe un excellent article de Wikipédia sur les moniteurs :

http://en.wikipedia.org/wiki/Monitor_(synchronisation)

Si vous faites défiler la page, vous verrez qu'il y a même un explicitement sur Java .

19voto

Zane XY Points 524

Citation de La machine virtuelle Java

Un thread de la machine virtuelle Java demande un verrou lorsqu'il arrive au début d'une région de surveillance. En Java, il existe deux types de régions de contrôle : les instructions synchronisées et les méthodes synchronisées.

Moniteur

Un moniteur est comparable à un bâtiment qui contient un r être occupée par un seul thread à la fois. La pièce contient généralement des données. Entre le moment où un thread entre dans cette pièce et le moment où il qu'elle quitte, elle dispose d'un accès exclusif à toutes les données de la salle. En entrant dans la salle s'appelle "entrer dans le moniteur". Entrer dans la pièce spéciale à l'intérieur du bâtiment s'appelle "acquérir le moniteur". L'occupation de la pièce est appelée "possession du moniteur", et le départ du moniteur est appelé "acquisition du moniteur". quitter la pièce est appelé "libérer le moniteur". Quitter l'ensemble du bâtiment s'appelle s'appelle "sortir du moniteur".

En plus d'être associé à un bit de données, un moniteur est associé à l'un ou l'autre des éléments suivants est associé à un ou plusieurs bits de code qui, dans ce livre, seront appelées régions de moniteur.

Comme nous l'avons déjà mentionné, le langage fournit deux éléments intégrés d'identifier les régions de contrôle dans vos programmes : les instructions synchronisées et les méthodes synchronisées. méthodes synchronisées. Ces deux mécanismes, qui mettent en œuvre l'aspe mutuelle de la synchronisation, sont pris en charge par la machine virtuelle Java de la machine virtuelle Java.

Verrouiller

Pour mettre en œuvre l'exclu associe un verrou (parfois appelé mutex) à chaque moniteur objet et à chaque classe. Un verrou est comme un privilège qu'un seul thread peut "posséder" à un moment donné.

Un même thread est autorisé à verrouiller plusieurs fois le même objet. Pour chaque objet, la machine virtuelle Java tient un compte du nombre d'objets verrouillés. de fois où l'objet a été verrouillé. Un objet non verrouillé a un compte de zéro. Lorsqu'un thread acquiert le verrou pour la première fois, le compte est à nouveau incrémenté à un. de nouveau incrémenté à un. Chaque fois que le thread acquiert un verrou sur le même objet, le compte est à nouveau incrémenté à un. même objet, le compte est à nouveau incrémenté.

7voto

abbas Points 483

A synchronized bloc autour d'un object est son moniteur, qui contrôle un verrou sur l'objet. Voici un exemple

synchronized (object) {
   while (<condition does not hold>)
      object.wait(timeout);
   ... // Perform action appropriate to condition
}

5voto

centroidBeta Points 31

La machine virtuelle Java utilise des moniteurs pour prendre en charge le multithreading. Les moniteurs y parviennent grâce à deux concepts : l'exclusion mutuelle lors de l'exécution des threads (c'est ici que le "verrouillage" entre en jeu) et la coordination en tant que moyen de communication entre les threads (c'est ici que les méthodes d'attente et de notification de l'objet entrent en jeu).

La lecture de la partie suivante de "Inside JVM" lèvera ce doute, car elle est très bien expliquée ici (Chapitre 20, Synchronisation des threads) -

https://www.artima.com/insidejvm/ed2/threadsynchP.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X