2008-10-06 19 views
1

Chaque objet Java (et sa classe) a un moniteur associé. En termes de pthread, un moniteur Java est équivalent à la combinaison d'un mutex réentrant et d'une variable de condition.Comment puis-je implémenter une synchronisation de type java (moniteurs) en utilisant l'API Win32?

Pour le verrouillage, l'API Win32 fournit des objets Mutex (qui sont réentrants mais lourds) et des sections critiques (non réentrantes mais légères). Il fournit également d'autres constructions de synchronisation, telles que des sémaphores et des événements, mais n'a pas de concept explicite de variable de condition.

Si j'écrivais une JVM, comment pourrais-je utiliser ces concepts Win32 pour implémenter des moniteurs Java?

Répondre

0

Je vous suggère de jeter un oeil à la source OpenJDK pour voir comment la classe ReentrantLock a été implémentée.

(Je ne l'ai pas vérifié moi-même, donc je ne suis pas sûr de la réponse).

Les verrous util.concurrent sont implémentés en utilisant l'API native.

+0

Sous Windows, il est implémenté à l'aide d'API natives et non de moniteurs Java. –

+0

Je vais jeter un coup d'oeil. Merci. –

+0

J'ai du mal à trouver le code source pertinent. Pourriez-vous me pointer dans la bonne direction? –

2

Windows a SignalObjectAndWait() qui peut être utilisé comme une attente sur une variable de condition dans un moniteur. Vous pouvez utiliser un événement (Reset) et un Mutex, puis utiliser PulseEvent() pour faire l'équivalent de la signalisation de la variable de condition.

+0

SignalObjectAndWait et PulseEvent ne sont pas fiables. Dans certaines conditions, ils ne fonctionnent pas. SignalObjectAndWait n'est pas garanti être atomique. PulseEvent ne fonctionne pas si les appels APC du noyau se produisent entre-temps. Combiner SignalObjectAndWait et PulseEvent peut être désastreux. –