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

Langage Java Discussion :

Mot clé Volatile


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Directeur technique
    Inscrit en
    Octobre 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1
    Par défaut Mot clé Volatile
    Bonjour à tous,

    J'ai un petit souci avec le mot clef Volatile.
    Pour le compte d'une formation, j'ai essayé d'illustrer l'utilité de cette déclaration par l'exemple ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class MyThread extends Thread {
     
     
    	private boolean m_boucle = true;
     
    	public void stopTheJob() {
    		m_boucle = false;
    	}
     
    	/** 
             * {@inheritDoc}
             */
    	@Override
    	public void run() {
    		super.run();
    		while (m_boucle) {
    			System.out.print('.');
    		}		
    	}
    }

    Un thread à l'extérieur évidemment change la valeur de m_boucle, mais avec ou SANS volatile, la boucle s'arrête toujours.
    Je suis en Java 5

    Merci d'avance.

  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,


    Le comportement de volatile n'est pas facile à montrer, car selon les optimisations de la JVM "ça peut" marcher même sans volatile...


    a++

  3. #3
    Expert confirmé
    Avatar de Auteur
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    7 661
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 7 661
    Par défaut
    bonjour,

    je suis surpris de voir super.run() dans la méthode run() de la classe. Est-ce une faute ? Sinon quel en serait l'intérêt ?


    ma question est sans doute hors sujet, si c'est le cas je suis désolé, mais ce super.run() m'intrigue

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Citation Envoyé par Auteur Voir le message
    Est-ce une faute ? Sinon quel en serait l'intérêt ?
    Probablement! Aucun!

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Par défaut
    Cela peut être intéressant pour mettre en place une instanciation de singleton thread-safe

    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    public class Singleton{
        private volatile static Singleton instance;
        private Singleton(){}
     
        public static Singleton getInstance() {
           if(instance == null){
              synchronized(Singleton.class){
                 if(instance == null){
                    instance = new Singleton();
                 }
              }
           }
     
            return instance;
        }
    }

    ça ne marche que sur du java 1.5 minimum car volatile est mal géré en dessous

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    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 483
    Par défaut
    Citation Envoyé par Yo Eight Voir le message
    Cela peut être intéressant pour mettre en place une instanciation de singleton thread-safe
    Non, comme indiqué dans le lien ci dessous, ce pattern ne fonctionne pas

    http://christophej.developpez.com/tu...tithread/#L3.4

    pour faire court, avec ce pattern, un autre thread pourrait voir "instance" alors que le constructeur n'a pas fini de s'initialiser.


    Pour les singleton, la deux seules pattern recommandables sont
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public class Singleton {
    private Singleton instance = new Singleton();
    public Singleton getInstance() {return instance;}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Singleton {
    private Singleton instance;
    public synchronized Singleton getInstance() {
      if (instance ==null)
          instance = new Singleton();
      return instance;
    }

Discussions similaires

  1. demande de précision sur le mot-clef volatile
    Par archimondain dans le forum Threads & Processus
    Réponses: 13
    Dernier message: 01/03/2012, 20h27
  2. mot clef volatile précision
    Par guillaume07 dans le forum C++
    Réponses: 26
    Dernier message: 18/12/2010, 10h09
  3. mot clef volatile
    Par elmcherqui dans le forum C++
    Réponses: 4
    Dernier message: 11/04/2008, 22h25
  4. Mot clé volatile
    Par Invité dans le forum C
    Réponses: 6
    Dernier message: 27/10/2006, 12h55

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