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 :

Accès concurrents


Sujet :

Java

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut Accès concurrents
    Bonjour,

    Concernant l'atomicité en Java, d'après ce que j'ai lu, c'est une possibilité qui permet d'utiliser des variables sans que les threads ne puissent manipuler celles-ci en même temps.

    Voici l'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @ThreadSafe
    public class CountingFactorizer implements Servlet {
      private final AtomicLong count = new AtomicLong(0);
      public long getCount() { return count.get(); }
      public void service(ServletRequest req, ServletResponse resp) {
        BigInteger i = extractFromRequest(req);
        BigInteger[] factors = factor(i);
        count.incrementAndGet();
        encodeIntoResponse(resp, factors);
    }
    }
    Ici c'est un code ThreadSafe et ma question est de savoir comment la classe AtomicLong permet de sécuriser l'accès à la variable par plusieurs threads ? Est-ce qu'elle aussi utilise des verrous ?

    Merci d'avance pour vos explications.

  2. #2
    Membre averti Avatar de rabDev
    Homme Profil pro
    Ingénieur développement logiciels, Concepteur et développeur de JMerise
    Inscrit en
    Mars 2011
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels, Concepteur et développeur de JMerise

    Informations forums :
    Inscription : Mars 2011
    Messages : 106
    Points : 328
    Points
    328
    Par défaut
    Bonjour,
    utilise .
    pour plus d'information regarde ce lien : http://rom.developpez.com/java-synchronisation/

    Bonne journée

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2011
    Messages : 342
    Points : 1 091
    Points
    1 091
    Par défaut
    Citation Envoyé par momedalhouma Voir le message
    ici c'est un code ThreadSafe, ma question c'est comment la classe AtomicLong pemermet de sécurisé l ' accès à la variable par plusieurs threads, est ce que elle aussi utilise des verous??

    merci d'avance pour vos explications.
    Apparemment cela dépend de l'implémentation (et donc de la plateforme). Tu peux regarder dans le source de AtomicLong, il y a une méthode native qui teste si les appels de comparaison/modification sont atomiques.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Au pire elle pourrait utiliser un verrou, oui, ce qui en Java se ferait normalement avec synchronized ou une boucle sur une variable volatile.
    Mais la plupart des microprocesseurs possèdent des instructions atomiques qui permettent de faire cela pour bien moins cher qu'un verrou. Raison pour laquelle l'implémentation est native : elle essaie d'utiliser le mécanisme le plus adapté au microprocesseur qui l'exécute.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre confirmé

    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2011
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Août 2011
    Messages : 181
    Points : 519
    Points
    519
    Billets dans le blog
    1
    Par défaut
    Slt,
    Possible aussi avec un mécanisme qui garantirai l'exclusion mutuel (synchronized, semaphore...)
    Bon courage

  6. #6
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut
    merci beaucoup pour vos réponses , on faite j'arrive pas à comprendre quelles sont les différences entre l'atomicité et les verrous,

    je sais qu'il font plus au moins la même chose : interdire l'accès à une variable par plusieurs thread en même temps .

    mais comment ça fonctionne sous le capot? je sais pas, et c'est ça ce que je cherche.

  7. #7
    Membre habitué
    Profil pro
    Opération
    Inscrit en
    Décembre 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Opération

    Informations forums :
    Inscription : Décembre 2012
    Messages : 91
    Points : 188
    Points
    188
    Par défaut
    La différence pratique entre les variables atomiques et les verrous est la performance. Les variables atomiques sont plus performant.
    Les variables atomique limite la synchronisation sur une variable unique tandis que un verrou permet la synchronisation sur un bloc d’instructions.
    Donc si vous utilisez synchronized uniquement pour protéger l’accès à une seule variable utilisez à la place les variables atomiques.

  8. #8
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par momedalhouma Voir le message
    on faite j'arrive pas à comprendre quelles sont les différences entre l'atomicité et les verrous,
    Parce que ce sont des notions, des idées générales en programmation multithreadée. Pas des mots-clés du langage.
    De manière générale les verrous sont l'un des mécanismes permettant d'obtenir l'atomicité. Donc l'atomicité est l'une des caractéristiques d'une instruction ou suite d'instructions, et le verrou est l'un des moyens de l'obtenir.

    Citation Envoyé par momedalhouma Voir le message
    je sais qu'il font plus au moins la même chose : interdire l'accès à une variable par plusieurs thread en même temps .
    Non : le verrou sert à obtenir l'atomicité (il y a d'autres moyens.) L'atomicité n'interdit rien du tout, elle garantit simplement que le résultat de l'opération atomique est le même, qu'il y ait un ou plusieurs threads sur le coup. Enfin, plus qu'une garantie, c'est ce que ça veut dire. Une opération est atomique si son résultat est le même sans être gêné par plusieurs threads. Si ce n'est pas le cas, ce n'est pas atomique.

    Citation Envoyé par momedalhouma Voir le message
    mais comment ça fonctionne sous le capot? je sais pas, et c'est ça ce que je cherche.
    Ben ça dépend de ce que le microprocesseur est capable de faire.
    S'il s'agit juste d'incrémenter une variable, les microprocesseurs sont en général capables de le faire en une seule instruction, et les instructions sont atomiques en cela qu'un seul cœur de microprocesseur peut enregistrer dans la même variable en même temps. Si deux cœurs arrivent en même temps pour modifier la même variable, l'un fait son instruction en entier, et l'autre attend (un temps très court) que le premier ait fini pour faire son instruction en entier.

    S'il s'agit d'opérations plus complexes, le microprocesseur ne fournit sans doute pas d'atomicité, et il faut donc la faire au niveau du programme, avec un verrou. Le verrou consiste à dire "un seul thread à la fois peut s'exécuter dans cette partie du programme." Le principe est que chaque thread qui arrive essaie de "prendre le verrou," s'il y arrive il est le seul, et il libérera le verrou à la fin. Sinon c'est qu'un autre a pris le verrou, et il attend que ce verrou se libère, puis quand le verrou est libéré il réessaie.
    Prendre un verrou consiste généralement à faire en sorte que le verrou passe de l'état "libre" à "pris" en une opération atomique, ce qui, derrière le capot, n'est qu'une mémoire mise à 1 ou 0, et changée avec une opération atomique du microprocesseur du genre "mets cette mémoire à 0 mais seulement si elle était à 1, et dis-moi le résultat."
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2011
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 262
    Points : 157
    Points
    157
    Par défaut
    thelvin

    merci beaucoup vous avez bien expliqué les choses.

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

Discussions similaires

  1. accés concurrent à une table
    Par shout dans le forum Oracle
    Réponses: 5
    Dernier message: 06/10/2005, 10h54
  2. Réponses: 22
    Dernier message: 25/08/2005, 16h03
  3. Lenteur et acces concurrent
    Par JeanMarc_T2k dans le forum Bases de données
    Réponses: 7
    Dernier message: 04/12/2004, 20h57
  4. acces concurrent avec delphi 5 entreprise
    Par Jean_paul dans le forum Bases de données
    Réponses: 2
    Dernier message: 30/11/2004, 20h19
  5. [EJB] Accès concurrents à la base de données
    Par cameleon2002 dans le forum Java EE
    Réponses: 10
    Dernier message: 23/09/2003, 11h31

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