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
?
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
Pourquoi utiliser la synchronisation du tout puisque method1() et method2() ne pas utiliser une ressource partagée? –