DUT Informatique 2
e
année Dec. Système & Réseaux - ASR6 10 novembre 2008
ASR6 : Sujet d'examen écrit
1h30min, 10 Novembre 2008
IUT Informatique 2, Décalés -- UNSA - 2008
Tous documents (cours, notes personnelles, sujets de TPs, programmes imprimés, etc.)
autorisés
Partie Programmation Concurrente
Exercice 1. Programme multi-thread Java offrant la notion de Semaphore
L'objectif de cet exercice est d'implanter en Java multi-thread l'equivalent de l'API
Semaphore disponible dans le package java.util.concurrent depuis la version 5 de Java, et
d'illustrer la manière d'utiliser un tel outil de synchcronisation généraliste . L'ensemble de
cet exercice devra être résolu en faisant uniquement appel à la notion de Moniteur
disponible dans le langage Java (pas de sémaphores, pas d'attente active, etc).
L'ensemble des méthodes que l'on vous demande de décrire se trouvera dans une seule
classe Java. Commencer par définir le constructeur de la classe. Puis :
1. Donner le code Java permettant d'implanter la méthode acquire() (equivalent du
P())
2. Donner le code Java permettant d'implanter la méthode release() (equivalent du
V())
3. Donner le code Java permettant d'obtenir le nombre de "billes" actuellement
disponibles
Pour toutes ces méthodes, expliquer clairement pourquoi vous avez besoin de les placer
dans un moniteur.
4. A présent, donner une deuxième version pour la méthode acquire(), qui puisse
prendre en paramètre un nombre de billes positif que l'on veut prendre "d'un seul coup"
(soit toutes d'un coup, soit aucune). Bien sur, cette nouvelle méthode a une signature
différente de celle de la première version. A votre avis, ces deux versions de acquire()
doivent elles être implantées par une même méthode dans votre classe, ou peuvent-elles
être clairement séparées ?
5. Pour finir cette classe, donner le code d'une méthode tryAcquire(int nbBilles) qui
permet de tenter d'acquérir le nombre de billes passe en paramètre (ou 1 bille en
l'absence de paramètre). Si le nombre de billes disponibles permet de satisfaire la
requête, le comportement de tryAcquire est exactement similaire a celui d'un
acquire(nbBilles). Autrement, la méthode renvoie une valeur false pour montrer
qu'aucune bille n'a été retirée.