Non, tant que vous verrouillez le même objet. Le code récursif a déjà le verrou et peut donc continuer sans entrave.
lock(object) {...}
est une abréviation pour l'utilisation de l'option Moniteur classe. En tant que Marc souligne , Monitor
permet [réentrée](http://en.wikipedia.org/wiki/Reentrant(subroutine))_ Les tentatives répétées de verrouillage d'un objet sur lequel le thread en cours a déjà un verrou fonctionnera parfaitement.
Si vous commencez à bloquer sur différents les objets, c'est là qu'il faut être prudent. Faites particulièrement attention :
- Toujours acquérir des verrous sur un nombre donné d'objets dans la même séquence.
- Déverrouillez toujours les serrures dans le inverser selon la manière dont vous les acquérez.
Si vous enfreignez l'une ou l'autre de ces règles, vous êtes pratiquement assuré d'obtenir des problèmes de blocage. à un moment donné .
Voici une bonne page web décrivant la synchronisation des threads dans .NET : http://dotnetdebug.net/2005/07/20/monitor-class-avoiding-deadlocks/
De même, verrouillez aussi peu d'objets à la fois que possible. Envisagez d'appliquer écluses à gros grains dans la mesure du possible. L'idée est que si vous pouvez écrire votre code de manière à ce qu'il y ait un graphe d'objets et que vous puissiez acquérir des verrous sur la racine de ce graphe d'objets, faites-le. Cela signifie que vous disposez d'un seul verrou sur cet objet racine et que vous n'avez donc pas à vous préoccuper de l'ordre dans lequel vous acquérez/libérez les verrous.
(Par ailleurs, votre exemple n'est pas techniquement récursif. Pour qu'il soit récursif, Bar()
devrait s'appeler lui-même, généralement dans le cadre d'une itération).