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

Collection et Stream Java Discussion :

[concurrence] Choix entre différentes synchronisations


Sujet :

Collection et Stream Java

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut [concurrence] Choix entre différentes synchronisations
    Bonjour,


    Je suis sur un petit problème de performances : je voudrais supprimer mon synchronized du code suivant en utilisant l'API java.util.concurrent pour gagner en performances. Avez-vous des idées de ce qui pourrait m'aider ?

    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
    public class MyService implements Runnable {
      private AtomicBoolean running = new AtomicBoolean(false);
      private final List<String> strings = new ArrayList<String>();
     
      public void addString(String s) { strings.add(s); }
      public void removeString(String s) { strings.remove(s); }
      public void run () {
        if (running.compareAndSet(false, true)) {
          while (isRunning()) {
            List<String> copy;
            synchronized (strings) {
              copy = new ArrayList<String>(strings);
            }
            for (String s: copy) {
              // Traitement long et coûteux, d'où le synchronized précédent
            }
          }
        }
      }
      public boolean isRunning() { return running.get(); }
      public void stop() { running.compareAndSet(true, false); }
    }

  2. #2
    Membre confirmé Avatar de Katachana
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2007
    Messages : 755
    Points : 503
    Points
    503
    Par défaut
    Tu trouveras des informations sur ce lien :
    Lien

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Merci du lien, mon problème est plutôt de bloquer la lecture que l'écriture : j'ai peu de lectures, mais beaucoup d'écriture (ajouts et suppressions). De plus, le CopyOnWrite suggère une liste relativement petite. Je ne sais pas ce qu'on appelle relativement petite, mais dans mon cas, la liste peut contenir jusqu'à 30000 éléments. En gros, CopyOnWrite ne résoudra certainement pas mon problème.

    Je vais néanmoins surfer sur le site et voir si d'autres cas ne sont pas plus appropriés pour moi.

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


    L'exemple que tu donnes n'est pas complètement synchronisé, puisque les méthodes addString() et removeString() ne le sont pas.

    Plus globalement, il faudrait savoir la manière dont tu vas utiliser ton service, et quel est le but de tout cela.

    Sinon tu peux peut-être te tourner vers les ReadWriteLock pour gérer toi même la synchro plus finement...

    a++

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Eh bien un tout grand merci : les RWLock semblent correspondre parfaitement à mon problème. J'ai des perfs acceptables tout en ne bloquant que ce qui est nécessaire et, surtout, sans utiliser le synchronized !

    Je ne pensais pas toutefois devoir synchroniser également les ajouts, pensant que le synchronized pour la lecture suffisait.

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

Discussions similaires

  1. Choix entre différents réseaux et module de communication
    Par sprite03 dans le forum Périphériques
    Réponses: 1
    Dernier message: 06/06/2010, 20h43
  2. Réponses: 20
    Dernier message: 03/03/2010, 15h32
  3. [FEDORA] choix entre différente architecture
    Par PC81 dans le forum RedHat / CentOS / Fedora
    Réponses: 1
    Dernier message: 17/03/2007, 21h38
  4. [XML] Choix entre différentes structures de fichier XML
    Par loic_86 dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 21/02/2007, 05h39
  5. Simulation de transmission de paquet entre différent réseaux
    Par MelloW dans le forum Développement
    Réponses: 2
    Dernier message: 12/07/2002, 19h51

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