Qu'est-ce qu'un moniteur en Java?

130

À quoi fait référence un moniteur dans la programmation simultanée en Java?

Quand je lis que "chaque objet a associé un moniteur" qu'est-ce que cela signifie?

Est-ce un objet spécial?

xdevel2000
la source
11
+1 Cela m'a fait lire comment les moniteurs sont implémentés au niveau JVM.
J'ai
@naikus J'attends de partager les détails de vous :)
roottraveller

Réponses:

90

Un moniteur est un mécanisme permettant de contrôler l'accès simultané à un objet.

Cela vous permet de faire:

Fil 1:

public void a()
{
    synchronized(someObject) {
        // do something (1)
    }
}

Fil 2:

public void b()
{
    synchronized(someObject) {
        // do something else (2)
    }
}

Cela empêche les threads 1 et 2 d'accéder à la section surveillée (synchronisée) en même temps. L'un démarrera et le moniteur empêchera l'autre d'accéder à la région avant la fin du premier.

Ce n'est pas un objet spécial. Ce mécanisme de synchronisation placé à la hiérarchie de classe racine: java.lang.Object.

Il y a aussi waitet notifyméthodes qui utiliseront également le moniteur de l' objet à la communication entre les différents threads.

Pablo Santa Cruz
la source
1
alors pouvons-nous dire que lorsque nous créons une méthode synchronisée, nous définissons un verrou (moniteur) sur la méthode de cet objet?
xdevel2000
28
Euh, pas exactement. Chaque objet est automatiquement associé à un moniteur (mutex), indépendamment de toute autre chose. Lorsque vous déclarez une méthode synchronisée, vous déclarez que le runtime doit obtenir le verrou sur le moniteur de l'objet avant que l'exécution de cette méthode ne commence (et doit libérer le verrou avant que le contrôle ne retourne au code appelant).
Andrzej Doyle
31
Et @Pablo - il n'y a pas de moniteur pour une méthode; les moniteurs n'existent que pour les objets, qui seraient l'instance englobante pour la plupart des méthodes, ou l' Classobjet correspondant pour les méthodes statiques. Si vous avez déjà une méthode synchronisée1 () et que vous déclarez méthode2 () synchronisée, aucun nouveau moniteur n'est créé et en fait, l'appel de l'une ou l'autre méthode (sur le même objet) tentera de verrouiller le même moniteur. Cela attrape souvent les nouveaux arrivants.
Andrzej Doyle
1
@Andrzej: donc, chaque objet a UN moniteur associé. Ensuite, je peux avoir de nombreuses méthodes synchronisées. Après chaque fois que de ces méthodes, un thread appelle il obtient ce moniteur qui effectue la synchronisation.
xdevel2000
1
juste besoin de clarifier cela ... l'objet qui est utilisé pour appeler un bloc synchronisé dans le thread 1 peut être utilisé à nouveau dans un autre thread (thread 2) pour appeler la méthode normale (non synchronisée) en même temps?
27

Un moniteur est une entité qui possède à la fois un verrou et un ensemble d'attente . En Java, tout Objectpeut servir de moniteur.

Pour une explication détaillée du fonctionnement des moniteurs en Java, je vous recommande de lire la section Monitor Mechanics de Concurrent Programming in Java (le lien précédent affiche l'aperçu dans les livres Google, et cette section est disponible pour lecture).

JRL
la source
Comme vous l'avez dit "Un moniteur est une entité ..", cela signifie-t-il que le moniteur est un objet / état interne qui possède / suit le verrou et l'attente? Si non Pouvez-vous s'il vous plaît élaborer Entity ici? Fondamentalement, lorsque nous java doc dit à Wakes up all threads that are waiting on this object's monitor. propos de notifyall (), ce que j'obtiens est que l'objet maintient (avec l'aide d'une entité / objet interne) ce que tous les threads attendent pour le verrouillage, cette entité / objet interne est appelé moniteur?
user3198603
Réponse la plus utile. Merci @JRL.
gravetii
Pour moi, il dit: "Aucun aperçu disponible pour cette page."
ouvrir le
9
  1. Un moniteur est un concept / mécanisme qui ne se limite pas au langage Java;
  2. "Dans la programmation simultanée, un moniteur est un objet ou un module destiné à être utilisé en toute sécurité par plus d'un thread";
  3. Comme chaque lecteur le sait, chaque objet en Java est une sous-classe de java.lang.Object. Les gens de Java ont créé java.lang.Object de telle manière qu'il possède des fonctionnalités et des caractéristiques qui permettent aux programmeurs Java d'utiliser n'importe quel objet comme moniteur. Par exemple, chaque objet a une file d'attente, une file d'attente de rentrée et des méthodes d'attente et de notification qui en font un moniteur;
  4. lisez sur les moniteurs ici .
mgibson
la source
4

Le langage Java et le système d'exécution prennent en charge la synchronisation des threads via l'utilisation de moniteurs.
Un moniteur est associé à un élément de données spécifique (une variable de condition) et fonctionne comme un verrou sur ces données. Lorsqu'un thread détient le moniteur pour certains éléments de données, d'autres threads sont verrouillés et ne peuvent pas inspecter ou modifier les données.


la source
2

Monitor est une construction de synchronisation qui permet aux threads d'avoir à la fois une exclusion mutuelle et la capacité d'attendre (bloquer) qu'une certaine condition devienne vraie.

Les moniteurs ont également un mécanisme pour signaler aux autres threads que leur condition est remplie. C'est une entité qui possède à la fois un verrou et un ensemble d'attente. En Java, n'importe quel objet peut servir de moniteur.

Dans la machine virtuelle Java, chaque objet et classe est logiquement associé à un moniteur. Pour implémenter la capacité d'exclusion mutuelle des moniteurs, un verrou (parfois appelé mutex) est associé à chaque objet et classe. C'est ce qu'on appelle un sémaphore en termes de systèmes d'exploitation, mutex est un sémaphore binaire.

Pour plus d'informations, consultez le lien

Swati Gour
la source