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 :

Pourquoi faire une synchronisation sur type primitif


Sujet :

Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 15
    Points
    15
    Par défaut Pourquoi faire une synchronisation sur type primitif
    Bonjour,

    Dans la classe Thread j'ai vu ce code et je ne comprends pas pourquoi il y a besoin de synchroniser l'incrémentation d'un type primitif ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
       /* For autonumbering anonymous threads. */
     
        private static int threadInitNumber;
        private static synchronized int nextThreadNum() {
            return threadInitNumber++;
        }
    et dans le constructeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      public Thread(Runnable target) {
            init(null, target, "Thread-" + nextThreadNum(), 0);
        }
    Qu'est-ce que j'ai oublié de savoir ? ou pas compris ?

    Merci à tous et à toutes pour vos réponses

  2. #2
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    l'incrémentation n'est pas un opération atomique: on lit une valeur, on l'incrémente et on l'écrit ... zou au milieu vl'a t'il pas qu'un vilain canard de Thread vient s'interposer
    maintenant pour ce genre de chose on utilise un AtomicInteger
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  3. #3
    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
    Et même si c'était atomique, ça résout pas les problèmes plus graves : les caches mémoire pas synchronisés, le réordonnancement...
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Points : 15
    Points
    15
    Par défaut Résolu Merci
    Merci a vous pour vos réponses.

    Je suis déçu. Je pensais que i++ se faisait en une seule instruction avec inc en assembleur.

    Si la variable peut être modifié par un autre thread faut la déclarer volatile pour éviter l'utilisation du cache et forcé la relecture oui je savais merci.

    Donc rien n'est (automatiquement) atomique en java faut penser comme ca en fait...

  5. #5
    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
    Alors:

    - i++ se fait bel et bien avec une seule instruction inc, si i est une variable locale (donc dans la pile). Mais le processeur java étant en pure pile, si i n'est pas dans la pile il va bien sûr falloir un load et un store.

    - une instruction, ça ne veut pas dire atomique. Il faut la déclarer atomique pour qu'elle le soit, et c'est plus cher. Il n'y a pas de magie, pour incrémenter une valeur dans la mémoire centrale, il faut récupérer cette valeur, calculer ce qu'elle vaut incrémentée, et stocker le résultat.

    - en Java, est atomique une lecture ou une écriture d'une référence d'objet, d'un boolean, d'un byte, d'un short, d'un char, d'un int et d'un float. En pratique sur les machines 64-bit c'est aussi le cas des long et des double, mais Java ne le garantit pas, du fait de l'existence du 32-bit. Il est très peu probable que les autres langages promettent plus sur des machines qui ne le font pas par elles-mêmes. Ce serait assez déplorable en performance.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

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

Discussions similaires

  1. faire une recherche sur une colonne de type 'time' calculée
    Par jean-gfnet dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/09/2013, 15h02
  2. Faire une recherche de type "contient" sur deux colonnes
    Par Sango64 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 05/08/2011, 10h20
  3. [Administration] Comment faire une synchronisation automatique sur serveur?
    Par jumanji34 dans le forum Subversion
    Réponses: 0
    Dernier message: 01/12/2010, 22h32
  4. [SOAP] Comment faire une requête sur un type concret ?
    Par verbose dans le forum Services Web
    Réponses: 1
    Dernier message: 17/06/2010, 13h57
  5. Réponses: 1
    Dernier message: 09/11/2006, 12h08

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