Chaque fois qu'une question surgit sur DONC sur Java synchronisation, certaines personnes sont très désireux de souligner que, synchronized(this)
doit être évitée. Au lieu de cela, disent-ils, un verrou sur un domaine privé de référence est à privilégier.
Certaines des raisons sont les suivantes:
- certains mal de code peut voler votre serrure (très populaire cet, a aussi un "accidentellement" variante)
- tous synchronisés méthodes au sein de la même classe d'utiliser exactement la même serrure, ce qui réduit le débit
- vous êtes (inutilement) de l'exposer trop d'informations
D'autres personnes, moi y compris, soutiennent que l' synchronized(this)
est un idiome qui est beaucoup utilisé (également dans les bibliothèques Java), est sûr et bien compris. Il ne devrait pas être évitée parce que vous avez un bug, et que vous n'avez pas la moindre idée de ce qui se passe dans votre programme multithread. En d'autres termes: s'il est applicable, de l'utiliser ensuite.
Je suis intéressé à voir quelques exemples du monde réel (pas de blabla) où évitant un verrou sur l' this
est préférable lors de l' synchronized(this)
serait aussi faire le travail.
Donc: faut-il toujours d'éviter synchronized(this)
et de le remplacer par un verrou sur un domaine privé de référence?
Certains plus d'infos (mise à jour des réponses):
- nous parlons d'instance de synchronisation
- les deux implicite (synchronisé méthodes) et de la forme explicite de l'
synchronized(this)
sont considérés comme - si vous citez Bloch ou d'autres autorités sur le sujet, ne laissez pas les parties que vous n'aimez pas (par exemple, Efficace Java, le point sur la Sécurité des Threads: "Généralement, c'est le verrouillage de l'instance elle-même, mais il y a des exceptions.")
- si vous avez besoin de précision dans votre verrouillage d'autres qu'
synchronized(this)
offre, alorssynchronized(this)
n'est pas applicable, ce qui n'est pas la question