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 :

méthode synchronized à remplacer


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut méthode synchronized à remplacer
    Bonjour ,

    voici mon problème j'utilise une méthode public synchronized pour accéder à un buffer , dans mon programme cette méthode est appelée de très nombreuses fois .
    Ces appels à répétition provoquent une augmentation du nombre de thread et la saturation de la mémoire car le gargage collector n 'arrive plus à libérer de la mémoire trop d'appels dans la secodne
    Comment je peux ré-écrire cette méthode pour éviter un verrou sur les threads et une libération plus rapide de la mémoire .
    Merci de votre aide

    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
    private Buffer content = new Buffer();
     
    public synchronized String getRow(final long lPosition) throws ApplicationPException {
            String sRow = content.get(lPosition);
    		if (sRow == null) {
    			sRow = "";
    			long lLinePosition = 0;
    		    if (lPosition != 1) {
    		        if (lIndexLength != 0) {
    		            lLinePosition = lIndexLength + 2 + (lPosition - 2)
    		                    * (lLineLength + 2);
    		        } else {
    		            lLinePosition = (lPosition - 1) * (lLineLength + 2);
    		        }
    		    }
    		    try {
    		        this.seek(lLinePosition);
    		        sRow = readLine();		       
    		    } catch (Exception eException) {
    		        throw new ApplicationException(ApplicationException.ERREUR_ACCES_BASE,
    		                "Erreur lors de la récupération du la ligne n°"
    		                        + lLinePosition + " du fichier '" + this.sFilePath
    		                        + "'");
    		    }
    		    if(!sFilePath.startsWith("APP")){
    				content.put(lPosition, sRow);
    			}
    		}
     
            return sRow;
        }

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. Ce n'est pas forcément le fait que la méthode soit synchronized qui augmente le nombre de threads, mais le fait qu'il y a plusieurs threads, à priori de plus en plus. La synchronisation peut contribuer à l'augmentation du nombre de threads en attente :
      1. par le temps d'exécution de la méthode. forcément plus elle est longue, plus les threads qui vont l'appeler vont attendre que le thread en cours d'exécution de la méthode ait terminé
      2. la possibilité de deadlock : des threads s'attendent les uns les autres indéfiniement, provoquant l'accumulation des nouveaux qui appellent la méthode
    2. Ce n'est pas forcément le fait que la méthode soit synchronized qui augmente la mémoire utilisée, mais les objets crées et non libérés tant que la méthode n'a fini d'être exécutés
    3. Pour ce qui du garbage collector, il faut voir si on ne passe pas beaucoup de temps à créer plein d'objets (inutilement) dont la libération à un moment va provoquer un gargage collecting long.


    Donc
    1. il faudrait voir les méthodes appelées dans la méthode getRow(). Ceci pour voir si on peut limiter la création de nouvelles instances.
    2. Ensuite il est possible de traiter plus finement le verrouillage pour limiter les temps d'attentes selon deux principes :
      1. ne verrouiller que les objets dont l'accès concurrent pose un problème
      2. ne verrouiller que les accès qui posent un problème de concurrence. Par exemple, on peut verrouiller en écriture, mais pas en lecture

      On peut le faire entre autres :
      1. en synchronisant sur des objets au lieu de synchroniser sur la méthode
      2. en utilisant l'API java.util.concurrent.locks
      3. en utilisant des classes qui utilisent des mécanismes plus souples éventuellement, comme les java.util.concurrent.atomic.*, on une ConcurrentMap, etc.

    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2010
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 51
    Par défaut
    merci pour ton retour

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/06/2008, 19h31
  2. java méthodes synchronized imbriquées
    Par tet.dum dans le forum Langage
    Réponses: 4
    Dernier message: 14/05/2007, 15h41
  3. Autres méthodes pour remplacer des If
    Par carlou135 dans le forum C++
    Réponses: 7
    Dernier message: 17/01/2007, 03h44
  4. Recherche méthode pour remplacer caracteres illegaux
    Par Attila50 dans le forum Général Java
    Réponses: 19
    Dernier message: 20/12/2006, 18h13
  5. blocage sur une méthode synchronized
    Par rockelite dans le forum Général Java
    Réponses: 3
    Dernier message: 03/05/2006, 23h28

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