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 :

"volatile" préconisé ou pas ?


Sujet :

Langage Java

  1. #1
    Membre Expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Par défaut "volatile" préconisé ou pas ?
    tout le monde,

    Je viens chercher votre aide au sujet du mot-clé volatile.

    Je fais des accès concurrents à une BD MySQL via un objet implémentant le patron Singleton me permettant de me connecter à cette base.

    Ayant des problèmes de concurrences, j'utilise le mot-clé "volatile" qui me permet d'éviter des erreurs (lorsque, par exemple, je fais une grosse requête dans un client et que j'ouvre un autre client pour exécuter une autre requête).

    J'aurais simplement voulu savoir s'il y avait des contre-indications sur l'utilisation de ce mot-clé, s'il était déprécié, si il ne fallait surtout pas l'utiliser avec des BD, ...

    Merci d'avance pour votre aide.

  2. #2
    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
    faudrait voir ton code, mais d'habitude ce n'est pas le mot clé volatile qu'on utilise pour çà. Volatile indique à la jvm et au compilateur de ne pas cacher le contenu de la variable dans les registres de la jvm. Pour les problème de multithreading on utilise la synchronisation.

  3. #3
    ndp
    ndp est déconnecté
    Membre expérimenté Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    faudrait voir ton code, mais d'habitude ce n'est pas le mot clé volatile qu'on utilise pour çà. Volatile indique à la jvm et au compilateur de ne pas cacher le contenu de la variable dans les registres de la jvm. Pour les problème de multithreading on utilise la synchronisation.
    Dans certains cas l'utilisation du mot cle volatile est plus simple a mettre en place et plus lege que d'utiliser synchronized, donc dans ces cas la, il ne faut pas s'en priver.
    Il faut l'avoir dans sa petite boite a outil, en sachant les differences avec synchronized (notamment par rapport a la section critique).

    Exp d'utilisation: Positionnement/test d'un flag. Si un seul thread peut ecrire le flag, tous les autres etant en lecture dessus, alors la declaration en volatile de la variable est suffisante.

  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
    comme si bien mentionné dans la faq de ce site, le mot clé volatile n'est pas nécessairement respecté par la jvm. De plus, à voir la question initiale (ok sans le code) j'ai l'impression que le posteur confond les roles de volatile et de section critique ou d'opération atomique...

  5. #5
    ndp
    ndp est déconnecté
    Membre expérimenté Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    comme si bien mentionné dans la faq de ce site, le mot clé volatile n'est pas nécessairement respecté par la jvm. De plus, à voir la question initiale (ok sans le code) j'ai l'impression que le posteur confond les roles de volatile et de section critique ou d'opération atomique...
    hum.. le mot cle volatile? le model de memoire java? Il faudrait un peu plus de precisions dans la FAQ.

  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
    y a une bonne explication (en anglais) sur les cas d'utilisation du volatile ici:
    http://www.ibm.com/developerworks/ja...GX02&S_CMP=EDU

  7. #7
    ndp
    ndp est déconnecté
    Membre expérimenté Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Par défaut
    Dans l'article, il n'y a RIEN dedans qui parle d'un risque par rapport au fait que des jvms ne supportent pas le mot cle volatile.
    C'est le point que je relevais dans ton precedent post.

    • Aujourd'hui (ce n'etaits peut etre pas le cas avant),une jvm qui ne respecte pas la specification du language java sur cette partie est a oublier.
    • Apres par rapport a l'utilisation de volatile,l'article de Brian Goetz est tres tres bon.

  8. #8
    Membre Expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Par défaut
    Merci pour cette discussion (qui à l'air de partir en troll )

    Voilà le code :
    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    private static volatile KCMySQLManagement.KPJNDIManagement FConnection = null;
     
    public static synchronized Connection getInstance() throws KPException {
    		try {
    			if (FConnection == null) 
    			{
    				FConnection = new KPJNDIManagement();
    				if (FConnection.getFConnection() == null) 
    				{
    					FConnection = null;
    				}
    			} 
    			else 
    			{
    				if (!FConnection.isOpened()) 
    				{
    					FConnection.setFConnection(null);
    					FConnection = null;
     
    					FConnection = new KPJNDIManagement();
    					if (FConnection.getFConnection() == null) 
    					{
    						FConnection = null;
    					}
     
    					KPGlobal.LOG0.error("--------------- MYSQL IS OUT");
    				}
    			}
    		} catch (Exception e) {
    			FConnection = null;
    			KPException eKPException = new KPException(e.getMessage());
    			eKPException.printMessage();
    			throw eKPException;
    		} finally {
    			if (FConnection != null) {
    				if (FConnection.getFConnection() != null) {
    					return FConnection.getFConnection();
    				}
    			}
    		}
    		return null;
    	}
    Cela me crée le singleton de connexion.

    Ce bout de code est la partie d'une application utilisant LCDS (pour ceux qui connaissent).

    J'utilise le mot-clé volatile pour résoudre une erreur simple :
    - je fais une longue série de requête (environ 6000) avec un client A
    - je tente de me connecter à l'application avec un autre client B
    Résultat : le client B ne se connecte pas tant que la série de requête n'a pas était réalisée.

    Après différents tests effectués hier, je me suis rendu compte que ce mot-clé ne résolvait pas entièrement mon problème mais étant curieux je voudrais savoir pourquoi la déclaration de la variable en "volatile" m'a permis de surmonter ce problème.

    Encore merci.

  9. #9
    Rédacteur

    Avatar de millie
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    7 015
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 015
    Par défaut
    Ce ne serait pas le mot synchronized sur tes méthodes static qui t'a permis de résoudre le problème ?

  10. #10
    Membre Expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Par défaut
    Non la seule différence entre mon problème et ma "pseudo-solution" c'est "volatile".
    Rien d'autre ni dans cette classe ni dans une autre.

  11. #11
    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,


    Quelques remarques :
    • Déjà tu parles de singleton alors que ce n'est pas du tout le cas
    • Les attributs static doivent être nommé en MAJUSCULE. Ici FConnection semble correspondre à un nom de classe ce qui rend le tout illisible...
    • Les bloc finally ne devrait pas contenir de return ! Cela pourrait te cacher une exception...



    Sinon : quel est l'objectif exacte de cette méthode getInstance() ?

    a++

  12. #12
    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
    je plusoie, le mot clé volatile, ici, ne sert absolument à rien à priori. On dirait que t'as mélangé deux patrons singletons pour java, le "traditionnel avec peu de performances":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static synchronized X getInstance(){
        if (instance==null)
            instance = new X();
        return instance;
    }
    Et le double check avec volatile (java5 et plus uniquement)

    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
     public class Singleton {
       private static volatile Singleton INSTANCE;
     
       // Protected constructor is sufficient to suppress unauthorized calls to the constructor
       protected Singleton() {}
     
       public static Singleton getInstance() {
          if (INSTANCE == null)
             synchronized(Singleton.class) {
               if (INSTANCE == null)
                 INSTANCE = new Singleton();
             }
          }
          return INSTANCE;
       }
    }

    De plus, même avec ton bloc synchronizé, la valeur de retour de "FConnection.getFConnection()" est-elle toujours la même? Ou renvoie-t-elle à chaque fois une objet différent. Il faut voir si ces objets retournés sont multithread safe!

  13. #13
    ndp
    ndp est déconnecté
    Membre expérimenté Avatar de ndp
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 227
    Par défaut
    A vue de nez,je suis d'accord avec tchize_.
    Le probleme peut aussi se situer ailleurs, les connections a la base de donnees peuvent etre un point de contention.

  14. #14
    Membre Expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Par défaut
    OK je vais voir ce que je peux faire.

    Pour répondre aux remarques en général :
    - la syntaxe est induite par une convention de codage (toute pourri je le conçois et j'adhère )
    - je reprends le code de quelqu'un qui démarre en Java donc soyez clément.

    Merci pour votre aide.

  15. #15
    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
    Non, moi c'est pas Clément, c'est David, sinon bon courage avec ta convention de codage

  16. #16
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    je plusoie, le mot clé volatile, ici, ne sert absolument à rien à priori. On dirait que t'as mélangé deux patrons singletons pour java, le "traditionnel avec peu de performances":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static synchronized X getInstance(){
        if (instance==null)
            instance = new X();
        return instance;
    }
    Et le double check avec volatile (java5 et plus uniquement)

    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
     public class Singleton {
       private static volatile Singleton INSTANCE;
     
       // Protected constructor is sufficient to suppress unauthorized calls to the constructor
       protected Singleton() {}
     
       public static Singleton getInstance() {
          if (INSTANCE == null)
             synchronized(Singleton.class) {
               if (INSTANCE == null)
                 INSTANCE = new Singleton();
             }
          }
          return INSTANCE;
       }
    }

    De plus, même avec ton bloc synchronizé, la valeur de retour de "FConnection.getFConnection()" est-elle toujours la même? Ou renvoie-t-elle à chaque fois une objet différent. Il faut voir si ces objets retournés sont multithread safe!
    Juste pour dire, le deuxième est faux : http://christophej.developpez.com/tu...n/multithread/
    Le plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public class MonSingleton {
        private static final MonSingleton INSTANCE = new Singleton();
        public static MonSingleton getInstance() {
            return INSTANCE;
        }
    }

  17. #17
    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 ®om Voir le message
    Juste pour dire, le deuxième est faux : http://christophej.developpez.com/tu...n/multithread/
    J'ai précisé "java 5 ou supérieur". C'est à dire des jvm dans lesqueles la portée du mot clé volatile a été étendue pour justement que les out of order write n'y soient pas autorisés

    http://en.wikipedia.org/wiki/Singlet...ava_5_solution

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

Discussions similaires

  1. Fonction Quoted printable qui ne fonctionne pas.
    Par leCcsympas dans le forum C
    Réponses: 3
    Dernier message: 13/01/2007, 19h54

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