2010-09-01 28 views
2

Je suis en train de résoudre un problème de dégradation des performances dû à un conflit de verrous lourds. J'envisage de "scinder le partage" pour résoudre ce problème.Acquisition de verrous sur des membres statiques dans une classe Java

Le modèle d'utilisation du squelette est ::

:: usage courant

public class HelloWorld{ 

    public static synchronized method1(){ 
     //uses resource 1 
    } 
    public static synchronized method2(){ 
     //uses resource 2 
    } 

} 

mon approche ::

depuis method1() et method2() ne pas utiliser la même ressource, je pense à diviser les serrures. A partir de maintenant, ils se disputent tous les deux pour le verrou de classe, car ils sont tous les deux synchronisés statiquement. Je pense à changer à ::

public class HelloWorld{ 

    **private static Object resr1Lock = new Object();** 

    public static method1(){ 
     synchronized(resrc1Lock){ 
      //uses resource 1 
     } 
    } 

    **private static Object resr2Lock = new Object();** 
    public static method2(){ 
     synchronized(resrc2Lock){ 
      //uses resource 2 
     } 
    } 

} 

Vont-ils maintenant soutenir la « classe Lock » ou resr1Lock/resrc2Lock?

+0

Merci beaucoup, les gars, ils ont en effet boosté les performances :-) [de près de 20x] Une autre étude de cas pour analyser les patterns de synchronisation dans n'importe quelle application – user170008

+0

Pourquoi utiliser la synchronisation du tout puisque method1() et method2() ne pas utiliser une ressource partagée? –

Répondre

3

Ils vont maintenant lutter pour les 2 objets « resr1Lock »/"resrc2Lock. Il fonctionnera comme prévu.

2

Ils ne contesterai pas un verrou sur l'objet Class plus donc oui cela va résoudre ce problème