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 :

Toujours à propos de la synchronisation


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Toujours à propos de la synchronisation
    Encore une petite question. Voici un exemple de classe:
    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
    public class A {
    
        private Collection<XListener> listeners;
    
        public A() {
            listeners = Collections.synchronizedCollection(new ArrayList<XListener>());
        }
    
        public void addXListener(XListener listener) {
            listeners.add(listener);
        }
    
        private void fireX() {
            for(XListener listener : listeners)
                listener.x();
        }
    
    }
    Est-ce que le Collections.synchronizedCollection() garantit que le parcours via l'itérateur (foreach) par un Thread A ne pourra pas se faire "en même temps" que le listener.add() par un Thread B?
    Ou alors ça garantit juste que la création de l'itérateur sera synchronisé, mais pas son parcours?

  2. #2
    Membre chevronné Avatar de gronono
    Inscrit en
    Novembre 2003
    Messages
    457
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Novembre 2003
    Messages : 457
    Par défaut
    synchronizedCollection garantie que les accès avec les méthodes la classe Collection se font de maniere synchronisée.
    Par exemple la méthode Collection.add devient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public boolean add(E o) {
    	    synchronized(mutex) {return c.add(o);}
            }
    Elle ne garantie l'accès synchronisé lors parcours de la collection avec l'iterator:
    Citation Envoyé par Javadoc
    It is imperative that the user manually synchronize on the returned list when iterating over it:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      List list = Collections.synchronizedList(new ArrayList());
          ...
      synchronized(list) {
          Iterator i = list.iterator(); // Must be in synchronized block
          while (i.hasNext())
              foo(i.next());
      }

  3. #3
    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
    OK merci, c'est ce que je pensais...

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    Citation Envoyé par gronono
    Elle ne garantie l'accès synchronisé lors parcours de la collection avec l'iterator
    Et sans passer par l'itérateur ? Par exemple, la méthode get(int index) est-elle synchronisée dans ce cas ?

    A quoi font appel les boucles étendues (foreach) ? A l'iterator ? autre ?

  5. #5
    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 marchand_de_sable
    Et sans passer par l'itérateur ? Par exemple, la méthode get(int index) est-elle synchronisée dans ce cas ?

    A quoi font appel les boucles étendues (foreach) ? A l'iterator ? autre ?
    La méthode get(int index) est synchronisée, mais forcément, la synchronisation ne met un verrou que pour l'accès à un index. Dès que tu passes à l'index suivant, le verrou est entre temps libéré et un autre est remis.

    La boucle foreach fait appel à l'itérateur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Collection<String> strings = new ArrayList<String>();
    for(String s : strings) {
        ...
    }
    est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Collection<String> strings = new ArrayList<String>();
    Iterator<String> iterator = strings.iterator();
    while(iterator.hasNext()) {
        String s = iterator.next();
        ...
    }

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 418
    Par défaut
    OK, donc ça ne servirait à rien d'utiliser "l'ancienne" boucle for avec des get(int index)... Il faudrait elle aussi la mettre dans un block synchronisé.

    Merci pour l'info

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

Discussions similaires

  1. Toujours à propos des DLL
    Par Athur dans le forum Threads & Processus
    Réponses: 6
    Dernier message: 17/03/2011, 19h29
  2. [eCommerce] Toujours à propos du tutoriel sur la création d'un panier en PHP
    Par patriciaprovence dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 8
    Dernier message: 03/09/2010, 20h12
  3. VBA, Graphique : Toujours à propos des ranges discontinus ..
    Par CCHEVALIER dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 28/09/2005, 09h15
  4. Fonctionnement de la compression DivX
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 20/09/2002, 14h10
  5. A propos du composant DBGrid
    Par _Rico_ dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/07/2002, 09h18

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