web-dev-qa-db-fra.com

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

En lisant des articles sur les fils Java, je remarque souvent l'expression: "le fil courant est le propriétaire du moniteur de cet objet". J'ai le sens: le fil a le droit d'opérer sur l'objet. Mais je suis perplexe pourquoi nous utilisons l'expression "le moniteur de l'objet" au lieu de "le verrou de l'objet"?

En bref, je ne connais pas la signification du mot "moniteur". La question peut être étrange et simple. Mais je souhaite que n'importe qui puisse aider à le résoudre. 3ks

77
jiafu

mais je suis perplexe pourquoi utiliser Word "le moniteur de l'objet" au lieu de "le verrouillage de l'objet"?

Voir la réponse d'ulmangt pour les 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 d'abord été implémentés dans le langage Pascal Concurrent de Brinch Hansen."

(Source: Wikipedia )

Pourquoi utiliser le terme "moniteur" plutôt que "verrouiller"? Eh bien à proprement parler, les termes signifient des choses différentes ... surtout si vous les utilisez de la manière dont ils étaient initialement destinés à être utilisés.

  • Un "verrou" est quelque chose avec des primitives d'acquisition et de libération qui conservent certaines propriétés de verrouillage; par exemple. usage exclusif ou auteur unique/lecteur multiple.

  • Un "moniteur" est un mécanisme qui garantit qu'un seul thread peut exécuter une section (ou des sections) de code donnée à un moment donné. Cela peut être implémenté à l'aide d'un verrou (et de "variables de condition" qui permettent aux threads d'attendre ou d'envoyer des notifications à d'autres threads que la condition est remplie), mais c'est plus qu'un simple verrou. En effet, dans le cas Java, le verrou réel utilisé par un moniteur n'est pas directement accessible. (Vous ne pouvez simplement pas dire "Object.lock ()" pour empêcher d'autres threads de l'acquérir. .. comme vous pouvez le faire avec une instance Java Lock.)

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

47
Stephen C

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

Il y a un excellent article Wikipedia sur les moniteurs:

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

Si vous faites défiler vers le bas, il y a même un section explicitement sur Java .

21
ulmangt

Un bloc synchronized 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
}
5
abbas

Même s'il est tard pour répondre à cette question, j'ai pensé à ajouter au cas où cela serait utile.
Voici un bloc synchronisé de Java dans une méthode non synchronisée Java

public void add(int value){
synchronized(this){
      this.count += value;
   }
}

Dans l'exemple "this" est utilisé, c'est-à-dire l'instance à laquelle la méthode add est appelée. Une méthode d'instance synchronisée utilise l'objet auquel elle appartient en tant qu'objet moniteur.
=> Un seul thread peut s'exécuter à l'intérieur d'un Java synchronisé sur le même objet moniteur.

4
aman

Citation de à l'intérieur de la Java

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

Moniteur

Un moniteur est comme un bâtiment qui contient une pièce spéciale qui peut être occupée par un seul thread à la fois. La salle contient généralement des données. Du moment où un thread entre dans cette salle jusqu'au moment où il en sort, il a un accès exclusif à toutes les données de la salle. L'entrée dans le bâtiment du moniteur est appelée "entrée 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 "posséder le moniteur" et quitter la pièce est appelée "libérer le moniteur". Quitter tout le bâtiment est appelé "sortir du moniteur".

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

Comme mentionné précédemment, le langage propose deux méthodes intégrées pour identifier les régions de surveillance dans vos programmes: les instructions synchronisées et les méthodes synchronisées. Ces deux mécanismes, qui implémentent l'aspect d'exclusion mutuelle de la synchronisation, sont pris en charge par le jeu d'instructions de la machine virtuelle Java).

Verrouiller

Pour implémenter la capacité d'exclusion mutuelle des moniteurs, la machine virtuelle Java Java associe un verrou (parfois appelé mutex) à chaque objet et classe. Un verrou est comme un privilège qu'un seul thread peut "posséder" " à n'importe quel moment.

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

3
Zane XY

Java Virtual Machine utilise des moniteurs pour prendre en charge le multithreading. communication des threads (c'est là que les méthodes d'attente et de notification d'objet entrent en image).

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

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

2
adityalad