1 votes

Quand devons-nous appeler à utiliser entre la méthode synchronisée et le bloc synchronisé ?

Est-ce que quelqu'un peut s'il vous plaît partager son expérience sur "Quand devons-nous appeler à utiliser entre la méthode synchronisée et le bloc synchronisé" Des problèmes de performance?

1voto

Stephen C Points 255558

Quand devons-nous choisir entre la méthode synchronisée et le bloc synchronisé ?

Si vous voulez verrouiller pendant la durée d'un appel de méthode ET que vous voulez verrouiller sur this (ou la classe actuelle, pour une méthode static), alors les méthodes synchronized sont la bonne solution.

Si vous verrouillez sur autre chose (par exemple, un objet de verrouillage privé ou une structure de données interne), alors l'approche du bloc synchronisé est meilleure.

De même, si seule une partie du code dans un appel de procédure doit être exécutée en maintenant un verrou, il est préférable d'utiliser un bloc synchronisé et d'y mettre uniquement ce code.

Des problèmes de performance ?

Aucun, à part le principe général selon lequel il n'est pas judicieux de maintenir un verrou plus longtemps que nécessaire. (Plus un verrou est maintenu, plus il est probable que d'autres threads devront attendre.)

0voto

Adamski Points 29884

Je ne suis pas sûr de ce que vous voulez dire par "déclaration synchronisée". Vous utilisez le mot-clé synchronized pour indiquer soit qu'une méthode est synchronisée, soit (comme vous le mentionnez) un bloc de code à l'intérieur.

Je préfère généralement garder les méthodes petites et gérables et donc étiqueter toute la méthode comme synchronisée (si nécessaire). Cela a l'avantage d'être immédiatement évident pour un utilisateur de la classe quelles méthodes représentent des sections critiques. Cela vous permet également en tant que programmeur de déterminer plus facilement si une classe est thread-safe, à savoir: Toutes les méthodes publiques qui accèdent aux données mutables sont-elles étiquetées comme synchronisées?

Il n'y a pas de différence de performance entre les approches car les deux nécessitent l'obtention d'un verrou.

0voto

Phani Points 1848

Toujours essayer d'utiliser un bloc synchronisé si possible, sinon optez pour une méthode synchronisée. Il y aura beaucoup d'améliorations de performances en fonction du nombre de lignes dans la méthode synchronisée. À mesure que le nombre de lignes augmente, les performances se dégraderont.

0voto

John Smith Points 196

Je tends à utiliser des méthodes synchronisées lorsque c'est l'interface publique qui nécessite une synchronisation (cf. collections synchronisées) et des blocs synchronisés pour la synchronisation interne de la classe, telle que l'accès à une ressource partagée qui doit être thread safe.

Il y a aussi une question de lisibilité. Je trouve que la synchronisation au niveau de la méthode est plus propre et plus évidente car le code n'est pas encombré par la gestion des verrous.

Quant aux performances, je ne suis pas au courant de différences particulières dans le comportement des deux approches. Je pense qu'il est plus important d'éviter une synchronisation excessive, donc une méthode qui a seulement besoin d'accéder à la ressource partagée une fois sur 10 devrait utiliser la synchronisation au niveau du bloc plutôt qu'au niveau de la méthode.

Ma approche de chaque scénario donné est généralement basée sur un mélange de ces facteurs, modifié par mon expérience précédente.

0voto

Chris J Points 3923

En termes de performances globales, il n'y a pas de différence entre avoir un bloc ou une méthode synchronisé(e). Le problème se situe vraiment en termes de pratiques de codage. Synchroniser une méthode semble être une chose facile à faire, cependant, lorsque l'on travaille avec plusieurs personnes sur un projet, il devient possible pour quelqu'un de modifier une méthode simple qu'une autre personne a synchronisée en une opération beaucoup plus lourde. En fait, un très bon exemple (de mon expérience personnelle) de là où vous pouvez rencontrer des problèmes est lorsque vous utilisez un framework d'injection de dépendances et que vous avez des méthodes dans un objet de service qui interagissent avec des objets d'accès aux données (daos) qui sont synchronisés. L'attente est que les daos s'exécutent rapidement donc les verrous ne sont maintenus que brièvement. Quelqu'un d'autre arrive et modifie les daos en créé de nouveaux qui sont bien plus lents et tout à coup les choses commencent vraiment à ralentir parce que l'objet de service a une interaction synchronisée avec cela.

Je ne pense pas que les blocs synchronisés peuvent contourner le problème que j'ai décrit ci-dessus cependant, au moins avec des blocs synchronisés, ils sont plus difficiles à manquer qu'une déclaration dans la méthode.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X