Retour à l'acceuil

Information sur l'article

Categorie: csharp, concurrency, lock, monitor, interlocked

Mise à jour: 2025-08-09

Temps de lecture: 10 min

C# lock, Monitor, Interlocked : maîtriser la synchronisation sans pièges

C# lock, Monitor, Interlocked : maîtriser la synchronisation sans pièges

Mise à jour: 2025-08-09


Synchronisation en C# : lock, Monitor, Interlocked


En C#, la synchronisation s’appuie sur lock, Monitor (Enter/Exit/Wait/Pulse) et Interlocked. Voici comment les choisir et les utiliser correctement.


lock : sucre syntaxique de Monitor


lock compile vers Monitor.Enter/Exit et est réentrant par thread. À privilégier par défaut.

Éviter de locker des objets publics, des types string ou Type; préférer un champ privé readonly dédié.


Monitor.Enter/TryEnter/Exit : contrôle fin + Wait/Pulse


Monitor.TryEnter avec timeout permet de limiter le risque de deadlock et d’appliquer un plan B.

Condition variables: Monitor.Wait libère le lock et se met en attente d’un Pulse/PulseAll. Toujours vérifier la condition dans une boucle.


Interlocked : opérations atomiques lock-free


Pour les compteurs et drapeaux, Interlocked évite un lock et fournit des barrières mémoire appropriées.

CAS (Compare-And-Swap) avec Interlocked.CompareExchange pour un toggle/idempotence sans lock.


Volatile & modèle mémoire .NET


Volatile.Read/Write garantit la visibilité entre threads pour des lectures/écritures simples. Pour des opérations composées, utiliser lock ou Interlocked.


Pièges & bonnes pratiques


- Deadlocks: ordre de prise des locks cohérent; timeouts via TryEnter si nécessaire.

- Ne jamais faire d’async/await dans un lock: préférer

SemaphoreSlim pour l’asynchrone.

- Éviter lock(this), lock(typeof(T)), lock sur string; utiliser un objet privé dédié.

- ReaderWriterLockSlim pour lectures majoritaires; Mutex pour inter‑process; SpinLock/SpinWait seulement pour cas très spécialisés.


Performance & choix


-

- Préférer Interlocked pour compteurs chauds; lock pour sections critiques courtes; structures plus haut niveau ("channels", pipelines) pour la coordination.


Conclusion


Merci d’avoir lu cet article. Si vous avez des questions, envie d’améliorer l’exemple ou de suggérer un sujet, contactez-moi: je serai ravi d’échanger.