Примитивы синхронизации доступно 🙏



1️⃣ Monitor



Простейший в использовании примитив синхронизации в .NET, который используется для обеспечения взаимоисключающего доступа к распределённому ресурсу путём получения или высвобождения блокировки на специальном объекте.



Монитор предназначен для использования в рамках одного процесса, и чтобы это делать максимально эффективно и удобно в C# завезли оператор lock - синтаксический сахар над конструкцией try-Enter-finally-Exit.



2️⃣ Mutex



Мьютекс очень похож на Монитор:



▪️предоставляет эксклюзивный доступ к ресурсу



▪️также как и Монитор, требует того, чтобы поток, получивший Мьютекс, высвободил его



Однако, главная прелесть этого примитива в возможности межпроцессной синхронизации - достаточно присвоить ему строковое имя, чтобы разные сервисы могли открывать уже существующий примитив.



3️⃣ Semaphore



Семафор ограничивает число потоков, у которых есть конкурентный доступ к пулу распределённых ресурсов.



При этом потоки, которые пытаются пробиться к ресурсу будут ждать, пока любой поток с доступом высвободит семафор, поскольку, в отличие от Мьютекса, поток, заполучивший примитив, не обязан его высвобождать - это может сделать другой.



Семафоры бывают именованными, для синхронизации на уровне ОС, и локальными в рамках одного процесса.



4️⃣ SemaphoreSlim



Это облегчённая и оптимизированная версия локального Cемафора.



Согласно предписаниям Microsoft его рекомендуется использовать для синхронизации в одном процессе.



5️⃣ Interlocked



Этот класс стандартной библиотеки предоставляет возможность выполнять простые атомарные операции на переменных, такие как: сложение, инкремент и декремент, перестановка и условная перестановка на основе сравнения, а также чтение long значений.