Les objets de conditions
La JDK 5 a apporté de nombreuses fonctionnalités au niveau du développement multi-threading. Aujourd’hui j’aimerais discuter un peu des objets de conditions.
Un objet de condition permet de définir une condition (non pas vrai?) à remplir avant de continuer le processus définit par votre programme. Imaginons que vous développiez une application de gestion de stock pour le garage Marielo du centre du patelin. Angelo, le gérant, veut pouvoir gérer son stock depuis la maison mais également que ses employés puissent le mettre à jour directement avec les clients lors d’un devis ou d’une commande spécifique. Maintenant passons par-dessus toute l’analyse, que vous avez d’ailleurs parfaitement effectuée avec Angelo lui-même, pour arriver au coeur de votre application: la méthode removePieceFromStock(Piece p, int quantity). Dans cette méthode l’utilisation d’objets de conditions devient évidente. En effet dans le cas ou plusieurs clients (de votre application donc) appellent cette méthode il vous faudra vérifier que votre stock contient bien le nombre de pièces à commander. S’il s’avère que le nombre de pièces est suffisant vous pouvez alors les retirer. Avant de vérifier le nombre de pièces en stock vous aurez obtenu un verrou sur l’objet courant du fait que cette méthode modifie l’état de votre stock. Maintenant si vous obtenez le verrou pour l’objet et que votre condition échoue… Vous devez libérer le verrou de l’objet afin que le stock puisse à nouveau être fourni en pièce(s) qu’il vous faut.
Avant la JDK 5 la seule possibilité d’utiliser un objet de condition était d’en créer soi-même et de gérer les accès depuis plusieurs threads. Autant dire que sans être un expert du genre les erreurs de conception ou du moins les performances pouvaient s’en ressentir très facilement.
Le package java.util.concurrent.lock fournit 2 classes particulièrement utiles dans notre situation. Je veux parler de Lock et de Condition. L’interface Lock définit un objet de verrou (plusieurs implémentations existent au sein du JDK). La classe Condition quant à elle représente un objet de condition. Un objet Lock comporte de nombreux avantages par rapport à une conception mettant en oeuvre uniquement des méthodes ou des blocs synchronized mais la définition de ces avantages n’est pas le but de ce post. Je vous laisse vous référer à la javadoc pour obtenir une description complète sur ces éléments de la librairie. Sommairement, il faut savoir qu’un objet Lock peut avoir plusieurs Conditions et que ces Conditions permettent de stopper le déroulement de votre programme lorsqu’une condition n’est pas remplie et de reprendre à cet endroit lorsqu’un autre thread signale que la condition peut avoir changé. Le principe est le même que celui des méthodes wait/notify de la classe Thread. Le premier avantage est pour ma part une meilleure lisibilité du code de l’application puisque l’on connaît directement l’objet de la condition à remplir.
Pour finir, voici une solution possible au développement pour Angelo:
public void removePieceFromStock(Piece p, int quantity) {
try {
lock.lock(); //acquiert le verrou
while(getQuantity(p) < quantity)
insuffisantCondition.await(); //libère le verrou
//retire le nombre de
//pièces du stock
} finally { lock.unlock(); //libère le verrou } }
/**
une autre méthode permettra de rajouter des pièces au stock;
dans cette méthode il faudra signaler que la condition change
en appelant la méthode insuffisantCondition.signalAll() ou
insuffisantCondition.signal() ce qui permettra de relancer un
thread en attente sur cette condition - à noter qu'il est
impératif d'obtenir le verrou qui possède la condition afin
de signaler un changement d'état
**/
}
Macbook arrivé!
Quel bonheur!
J’ai donc reçu mon macbook pro jeudi dernier dans l’après-midi. Je l’avais commandé fin août suite à mon embauche chez Logica. J’ai longtemps hésité entre un macbook et un macbook pro mais la taille de l’écran ainsi que la carte graphique a forcé mon choix. J’avais en effet peur qu’un écran de 13" soit un peu short pour du dev et la carte graphique (une GeForce 8600M GT de 256mo) va me permettre de faire de la virtualisation sans problème. La livraison a donc pris du temps, mais l’attente est justifiée lorsque l’on constate la qualité du package. Un emballage splendide et l’intérieur également. Dans ce domaine Apple est vraiment remarquable; c’est beau et ca fait d’autant plus plaisir! Voilà maintenant je n’ai plus qu’à configurer ma station de bureau en mode serveur pour avoir accès à tout mon travail effectué sans tout transférer…. J’adoooorrrrreeeee ca….
Au boulot!
[posted with ecto]
Embauche - Logica
Nous sommes le 23 août 2007 et cela fait maintenant 23 jours que je suis sans emploi. Durant tout ce temps j’ai pu constater combien le métier d’informaticien est recherché! Je me rappelle encore la réunion d’information concernant l’école que j’ai fréquentée…. “Il faudrait couper les nouveaux diplômés en 2 pour combler la demande!”… Eh bien visiblement la demande est toujours forte! En tout cas au niveau développement c’est flagrant.J’ai ainsi pu passer plusieurs entretiens et avoir plusieurs propositions (mandats, contrats temporaires). Content du résultat je n’ai pas fait l’erreur de me jeter tête baissée sur la 1ère offre venue mais j’ai plutôt attendu quelque peu… Bien m’en a fait! J’ai en effet reçu plusieurs coups de fil après avoir posté mon cv sur Monster (vous êtes dans l’info et vous cherchez du boulot? –> monster.ch!) et à ma grande surprise l’entreprise LogicaCMG s’est grandement intéressé à mon profil. Après un contact téléphonique et email j’ai pu passer un entretien détendu et fort sympathique avec eux et à présent mon embauche est en court de finalisation! Conclusion: ne pas se jeter sur la première offre d’emploi venue et rester patient jusqu’à ce qu’une offre vous plaise! Attention à ne pas idéaliser trop non plus (bien que pour moi, je n’aurais jamais imaginé entrer à mon âge dans une boîte du genre de Logica)