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

Concurrence et multi-thread Java Discussion :

Question sur les threads


Sujet :

Concurrence et multi-thread Java

  1. #1
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut Question sur les threads
    Bonjour,

    Je lisais quelques articles autour des threads en java, et je me posais une question sur la visibilité mémoire.

    J'utilise volatile, pour garantir que tous mes threads puissent voir les modifications associées à mon attribut. Idem sur la synchronisation (pour la visibilité) (avec mutex en plus).

    Je lisais dans un article : "toutes les variables qu'il a modifiées sont publiées auprès de tous les autres threads qui les connaissent".

    Ma question (peut-être bête) quand il parle de publier, c'est une publication au sens "les changements dans la heap" ? Ou d'un plus bas niveau comme sur le processeur ?

    Dites moi si je ne suis pas clair dans ma question.
    Merci d'avance

  2. #2
    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
    Pas très clair comme question, quoi le microprocesseur ?

    Le microprocesseur a un cache tout comme toute l'architecture, et donc quand on veut aller lire des données publiées il faut resynchroniser le cache, ce qui est bien géré par l'emploi de volatile ou de synchronized. De même pour tous les caches de tous les niveaux.
    C'est pour ça qu'on dit que les synchronisations ont un prix et qu'il faut pas en faire n'importe comment. D'un autre côté, il en faut pour faire du multithreadé, qui apporte beaucoup.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Ok donc il parle bien d'une publication au niveau du microprocesseur.

    Avec les architectures multi-coeurs, chaque coeurs possède ces propres caches (L1...L3) et registre. Les threads étant répartis sur chacun des coeurs, ils stockent en cache des valeurs (pour des questions d'optimisation). Si je synchronise, je force à ne pas optimiser ses valeurs (donc à les mettre en cache). Donc si je comprends bien ta réponse, il publie la valeur dans chacun des caches des coeurs ?

  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
    "Publication" n'est pas vraiment le mot. Il indique que cette portion de la mémoire a été modifiée par un cœur, et que les caches des autres ne sont plus synchrones avec la mémoire centrale.
    Mais les autres ne s'en soucieront qu'au moment opportun, genre au prochain accès à cette zone.

    Ce que je veux dire c'est que le travail d'un cœur n'a pas d'effet direct sur les caches des autres cœurs, il n'aura qu'un effet a posteriori s'ils se retrouvent concernés à un moment. Et notamment ils prendront tous les changements d'un coup au lieu de l'un après l'autre*.

    * Enfin c'est le grand classique. Il y a des architectures sans cache.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Modérateur
    Avatar de Gugelhupf
    Homme Profil pro
    Analyste Programmeur
    Inscrit en
    Décembre 2011
    Messages
    1 320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste Programmeur

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 320
    Points : 3 741
    Points
    3 741
    Billets dans le blog
    12
    Par défaut
    L'utilité d'employer le mot clé volatile sur un attribut, c'est que celui-ci est susceptible d'être utilisé dans plusieurs portion de code exécuté par un thread.

    Le problème en Java, c'est que les opérations sur les variables ne sont pas forcément atomiques (les valeurs sont conservés dans un cache dans un but d'optimisation je crois), du coup si tu as une variable qui a une valeur X à un instant T1 et Y à un instant T2 dans Thread A, cette variable pourrait toujours avoir la valeur X à l'instant T2 dans le Thread B.

    Je pense que cette histoire de "publication" revient à dire en gros : Thread A a modifié la variable volatile et sa valeur actuelle sera "publié" à Thread B.

    PS : adiGuba est plusieurs fois intervenu sur ce type de sujet, n'hésite pas à effectuer une petite recherche
    N'hésitez pas à consulter la FAQ Java, lire les cours et tutoriels Java, et à poser vos questions sur les forums d'entraide Java

    Ma page Developpez | Mon profil Linkedin | Vous souhaitez me contacter ? Contacter Gokan EKINCI

  6. #6
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Merci pour vos réponses.

    @Gugelhupf Pardon si je n'ai pas été clair, mais je pense avoir compris la fonction de volatile avec les threads au sein d'une application java.

    En faite, j'aurai aimé comprendre comment côté processeur, et du multi-coeur, cela fonctionnait.

    Après avoir lu les 4 premiers chapitre de Java Concurrency, ca n'est pas expliquer. Peut être dans les chapitres suivants.

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ca ne sera a priori expliqué nulle part. Et pour cause, la jvm est concue pour t'abstraire de l'architecture hardware. C'est aux personnes implémentant la jvm (donc oracle, open jdk, ibm) de faire en sorte que la jvm respecte les spécifications. Si tu veux des détails techniques, il y en a dans le java language specification et dans le java virtual machine specification. Toi, en tant que dev, tout ce que tu dois savoir, c'est c'est le comportement de synchronized quand on rentre dans un bloc et quand on en sort, ainsi que le comportement de volatile

  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
    Oui enfin c'est pas plus mal de savoir que sur les architectures utilisant des caches, ça va sûrement invalider ces caches et donc il y a une question de performance. Et que sur d'autres architectures, ça va synchroniser d'une manière ou d'une autre et ça va sûrement poser des questions de performance aussi.

    Il faut savoir synchroniser avec parcimonie, sinon on synchroniserait tout et la notion n'aurait pas de sens.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,



    Grosso-modo la JVM va faire toute sorte d'optimisation sur le code, et en particulier elle peut utiliser un cache local (registre CPU ou autre) pour les données utilisées par le thread.
    Du coup si deux threads manipulent la même variable en même temps, il est possible qu'ils n'aient pas accès aux mêmes valeurs, et certaines modifications peuvent passer inaperçu.



    Les outils de synchronisation permettent de donner une relation "happen-before" entre deux instructions situés dans différents threads.
    S'il y a une relation "happen-before" entre deux instructions, alors tu es sûr que les modifications apportées seront visible même si les threads sont différents (et donc que les caches seront mis à jour).

    Les divers outils de synchronisation (synchronized, volatile, mais aussi les Lock, Thread.join(), etc.) permettent donc de définir une telle relation.
    • Lorsque tu rentres dans un bloc synchronized, tu es sûr de voir les modifications apportées avant la fin du dernier bloc synchronized sur le même verrou.
    • Lorsque tu lis une variable volatile, tu es sûr de voir les modifications apportées à la dernière modification de cette même variable.
    • Lorsque tu fais un join() sur un thread (ie : attendre que le thread se termine), tu es sûr de voir les modifications effectuées par le thread en question.
    • etc.



    Bref lorsqu'une relation "happen-before" survient, le cache du thread est vidé pour prendre en compte les modifications apportés par les autres threads.


    [edit] Pour plus de détail, le chapitre 17 des spécifications est très complet : http://docs.oracle.com/javase/specs/...ml/jls-17.html


    a++

  10. #10
    Membre actif Avatar de miya
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 469
    Points : 240
    Points
    240
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Grosso-modo la JVM va faire toute sorte d'optimisation sur le code, et en particulier elle peut utiliser un cache local (registre CPU ou autre) pour les données utilisées par le thread
    Je n'ai peut-être pas bien compris, mais quand vous parlez de "elle" et d'un registre CPU, c'est au niveau de la JVM ? Chaque threads possède leur stack + un cache, et lorsque l'on "publie" l'information, la JVM se charge de mettre à jour tous les caches des threads ?

    Pour compléter vos propros, l'article est intéressant : http://tinyurl.com/phqcudv

  11. #11
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par miya Voir le message
    Je n'ai peut-être pas bien compris, mais quand vous parlez de "elle" et d'un registre CPU, c'est au niveau de la JVM ? Chaque threads possède leur stack + un cache, et lorsque l'on "publie" l'information, la JVM se charge de mettre à jour tous les caches des threads ?
    Grosso-modo oui !

    Le stack ne concerne que les variables locales, et n'est donc pas concerné par le multithreading.
    Cela concerne uniquement les objets dans le heap.

    a++

Discussions similaires

  1. Question sur les threads
    Par thebloodyman dans le forum Concurrence et multi-thread
    Réponses: 3
    Dernier message: 22/01/2007, 07h28
  2. Questions sur les threads: généralités
    Par Gragra dans le forum C++
    Réponses: 9
    Dernier message: 04/11/2006, 16h28
  3. Quelques questions sur les threads
    Par benj63 dans le forum C++Builder
    Réponses: 28
    Dernier message: 21/11/2005, 13h27
  4. Question sur les threads
    Par Linio dans le forum Concurrence et multi-thread
    Réponses: 10
    Dernier message: 21/10/2005, 09h08
  5. Question sur les threads
    Par nicolas66 dans le forum MFC
    Réponses: 4
    Dernier message: 03/06/2005, 20h57

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