IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Fonctionnement des verrous


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 74
    Par défaut Fonctionnement des verrous
    Bonjour,

    J'ai quelques questions concernant les verrou en Java. Plus particulièrement les ReentrantReadWriteLock.

    En gros, je peux avoir 2 verrou: un en écriture et un en lecture. Sachant que je peux avoir plusieurs clients qui accèdent en lecture mais un et un seul qui accède en écriture ?

    Autre question: est-ce que tous les objets situés entre le:
    verrou.lock() et le verrou.unlock() sont protégés ? C'est à dire:

    Si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    verrouLecture.lock();
    this.read();
    verrouLecture.unlock();
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private void read(){
     objetB.contenu();
    }
    Je suis garanti que mon objetB ne sera pas modifié ?

    Dernière question:
    Dans le cadre d'une utilisation en réseau (avec des RMI), quels sont les verrous qu'il faut mieux utiliser sachant que je n'aurais pas plus de 4 clients connectés, mais que je dois retranscrire les mouvements de souris de chacun sur l'écran des autres? (au niveau de la latence)

    merci à ceux qui m'éclaireront

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Mister_Kp Voir le message
    En gros, je peux avoir 2 verrou: un en écriture et un en lecture. Sachant que je peux avoir plusieurs clients qui accèdent en lecture mais un et un seul qui accède en écriture ?
    Oui c'est exactement ça et c'est la grosse différence avec le synchronized() simple. Dans une application multithreadé si plusieurs threads accèdent aux mêmes données sans les modifier il n'y a aucun problème. Si un seul thread modifie ces données on peut se retrouver dans un état incohérent.

    synchronized() limite l'accès à une zone à un seul thread, là ou les ReentrantReadWriteLock autorise plusieurs threads de lecture si aucun thread n'est en écriture...

    Citation Envoyé par Mister_Kp Voir le message
    Autre question: est-ce que tous les objets situés entre le:
    verrou.lock() et le verrou.unlock() sont protégés ? C'est à dire:

    Si j'ai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    verrouLecture.lock();
    this.read();
    verrouLecture.unlock();
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private void read(){
     objetB.contenu();
    }
    Je suis garanti que mon objetB ne sera pas modifié ?
    Déjà une remarque importante : il faut utiliser un try/finally pour sécuriser le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    verrouLecture.lock();
    try {
        this.read();
    } finally {
        verrouLecture.unlock();
    }
    Comme ca à la fin du bloc tu libèreras bien le verrou, même si la méthode read() remonte une exception
    Cela permet de ne pas laisser un verrou bloqué par erreur...


    Sinon, pour revenir à ta question, les verrous ne garantissent pas ton code !!!
    Les verrous standard (ReentrantLock et les bloc synchronized) garantissent qu'un seul thread à la fois puisse rentrer dans le bloc correspondant.

    Pour les ReentrantReadWriteLock il y a deux modes distincts :
    • Les read-lock permettent plusieurs threads d'entrer dans les bloc, à condition que le write-lock ne soit pas utilisé.
    • Le write-lock empêche tous les autres threads d'obtenir le lock, que ce soit en lecture ou en ecriture.



    Donc c'est à toi de t'assurer que :
    • Les lectures se font seulement dans un read-lock (ou un write-lock : celui qui peut le plus peu le moins )
    • Les écritures se font dans un write-lock.


    En sachant que tu peux acquérir plusieurs fois le même lock sans problème (la seule chose à éviter est d'essayer d'obtenir le write-lock lorsqu'on a déjà le readlock).


    Citation Envoyé par Mister_Kp Voir le message
    Dans le cadre d'une utilisation en réseau (avec des RMI), quels sont les verrous qu'il faut mieux utiliser sachant que je n'aurais pas plus de 4 clients connectés, mais que je dois retranscrire les mouvements de souris de chacun sur l'écran des autres? (au niveau de la latence)
    Avec 4 clients la différence avec un bloc sychronized ne doit pas se faire sentir, mais je pense que les readwritelock sont mieux adapté...

    Sinon jettes un coup d'oeil au package java.util.concurrent, qui propose un certain nombre de collections qui gèrent les aspects concurrentielles, et qui pourraient très bien répondre à tes besoins...


    a++

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par Mister_Kp Voir le message
    Autre question: est-ce que tous les objets situés entre le:
    verrou.lock() et le verrou.unlock() sont protégés ?
    nan nan nan nan nan, c'est pas magique! C'est un outil qui sert à une méthodologie. Une fois que tu as fait verrou.lock(), la seule garantie que tu as, c'est que personne d'autre ne saura faire de verrou.lock() (si verrou est un verrou exclusif) tant que tu n'aura pas fait de verrou.unlock(). Ce qu'on appelle une ressource "protégée", c'est une ressource qui ne peut être accessible *que* dans le cadre d'un lock, mais c'est à toi de faire çà proprement dans ton code. Si t'oublie de faire un lock quelque part, tu casse ton principe

    Dans le cadre du readwrite lock, tant que tout le monde n'a pas libéré les readLock(), personne ne peut faire de writeLock(). De même tant que le writeLock() n'est pas libéré, on ne peut pas faire le readLock().


    Pour ton projet RMI, un verrou simple devrait etre suffisant, après tout y a que 4 Thread en concurrence. Par contre, faut bien faire gaffe à ne garder les verrous que le moins de temps possible, comme toujours.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Fonctionnement des comparateurs de prix ?
    Par masseur dans le forum Services
    Réponses: 3
    Dernier message: 22/01/2006, 21h11
  2. Fonctionnement des attributions de droits sur table et bdd ?
    Par shako95 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/11/2005, 13h39
  3. Fonctionnement des WeakHashMap
    Par seiryujay dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 03/10/2005, 14h12
  4. Fonctionnement des fichiers.
    Par phoenix440 dans le forum Autres Logiciels
    Réponses: 7
    Dernier message: 29/05/2005, 15h36
  5. [langage] fonctionnement des Processus
    Par GMI3 dans le forum Langage
    Réponses: 3
    Dernier message: 19/09/2003, 11h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo