À 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?
À 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?
Réponses:
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 wait
et notify
méthodes qui utiliseront également le moniteur de l' objet à la communication entre les différents threads.
Class
objet 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.
Un moniteur est une entité qui possède à la fois un verrou et un ensemble d'attente . En Java, tout Object
peut 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).
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?
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.
http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#33308
Un mécanisme pour contrôler l'accès aux objets un par un
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.
http://journals.ecs.soton.ac.uk/java/tutorial/java/threads/monitors.html
le moniteur est associé à un objet ou à un membre de données, qui est acquis lorsqu'un membre de données ou un objet est entré dans un bloc de synchronisation (section critique) et est libéré lorsqu'il est terminé.