Ceux-ci utilisent tous deux des verrous intrinsèques. Votre premier exemple consiste à utiliser le verrou intrinsèque de lock
, tandis que le second utilise le verrou intrinsèque de this
. La question est de savoir si this
est vraiment ce que vous voulez verrouiller, ce qui n'est souvent pas le cas.
Considérez le cas, lorsque vous utilisez synchronized(this)
à l'intérieur de l'une de vos méthodes. Vous avez 2 objets de cette classe, et ces objets font référence à une ressource partagée. Si vous verrouillez this
Ensuite, vous n'aurez pas d'exclusivité mutuelle à cette ressource. Vous devez verrouiller un objet auquel tout ce qui peut accéder à la ressource a accès.
Verrouiller this
Seulement si la ressource importante fait partie de la classe elle-même. Même alors, dans certains cas, un objet de verrouillage est meilleur. De plus, s'il y a plusieurs ressources différentes dans votre classe, qui n'ont pas besoin d'être mutuellement exclusives dans son ensemble, mais individuellement, vous avez besoin de plusieurs objets de verrouillage.
La clé est de vraiment savoir comment synchronisé Fonctionne et soyez conscient de ce que fait réellement votre code