46 lines
1.9 KiB
Markdown
46 lines
1.9 KiB
Markdown
|
Moniteurs en Java (rappel) :
|
|||
|
--------------------
|
|||
|
|
|||
|
- Créer un objet de type java.util.concurrent.locks.Lock
|
|||
|
(à partir de java.util.concurrent.locks.ReentrantLock) :
|
|||
|
` mon_moniteur = new java.util.concurrent.locks.ReentrantLock();`
|
|||
|
Cet objet réalise le moniteur en fournissant, par son utilisation
|
|||
|
explicite, l'exclusion mutuelle et permet de créer des
|
|||
|
variables-conditions associées au verrou.
|
|||
|
` `
|
|||
|
*Remarque* : Il est possible de créer un ReentrantLock équitable (mais pas nécessairement FIFO) :
|
|||
|
` mon_moniteur = new java.util.concurrent.locks.ReentrantLock(true);`
|
|||
|
|
|||
|
|
|||
|
- Créer une ou des variables-conditions (java.util.concurrent.locks.Condition)
|
|||
|
à partir du "lock" précédemment créé :
|
|||
|
|
|||
|
`ma_var_condition = mon_moniteur.newCondition();`
|
|||
|
|
|||
|
- Les opérations doivent explicitement manipuler le verrou pour obtenir
|
|||
|
l'exclusion mutuelle :
|
|||
|
|
|||
|
`mon_opération() {`
|
|||
|
` mon_moniteur.lock();`
|
|||
|
|
|||
|
` ... `
|
|||
|
|
|||
|
` mon_moniteur.unlock(); `
|
|||
|
` }`
|
|||
|
|
|||
|
- Les variables-conditions s'utilisent avec
|
|||
|
|
|||
|
` ma_var_condition.await();`
|
|||
|
et
|
|||
|
` ma_var_condition.signal();`
|
|||
|
` ma_var_condition.signalAll();`
|
|||
|
|
|||
|
- La sémantique est priorité au signaleur, sans file des signalés :
|
|||
|
* en outre, l'attente sur les conditions n'est **pas FIFO**, et
|
|||
|
* le signaleur conserve l'accès exclusif
|
|||
|
* le signalé est réveillé, mais doit réacquérir l'accès exclusif, et il n'est pas
|
|||
|
prioritaire par rapport aux entrants en attente (que le verrou soit équitable ou non) ;
|
|||
|
il doit donc nécessairement retester la condition attendue, car elle a pu être utilisée/
|
|||
|
invalidée par un entrant avant qu'il obtienne l'accès exclusif.
|
|||
|
Il faut donc penser à utiliser des boucles "while" pour déterminer si les conditions
|
|||
|
attendues sont effectivement vérifiées au moment du réveil.
|