What is the difference between lock, mutex, and semaphore in multithreading?
Muhammad Imran Ansari
🔐 1. lock (Monitor)✅ What is it?A C# keyword (shorthand for Monitor.Enter / Monitor.Exit).
Used to synchronize access to a critical section of code by one thread at a time.
🧠 Key Points:Works within the same process (not across processes).
Automatically releases the lock even if an exception occurs (thanks to syntactic sugar).
🧪 Example:private object _lockObj = new object();
lock (_lockObj){ // Only one thread can enter here at a time sharedResource++;}
🧭 Analogy:Imagine a single bathroom key in a house. Only one person (thread) can hold the key and use the bathroom at a time.
🛑 2. Mutex (Mutual Exclusion)✅ What is it?A thread synchronization object that can work across multiple processes.
Slower than lock due to kernel-level handling.
🧠 Key Points:Useful when different applications need to coordinate access to a resource (e.g., file).
Must be manually released using mutex.ReleaseMutex().
🧪 Example:Mutex mutex = new Mutex(false, “MyAppMutex”);
if (mutex.WaitOne()){ try { // Critical section } finally { mutex.ReleaseMutex(); }}
🧭 Analogy:A public restroom key that you check out from the reception. Even people from outside your home (other processes) can queue up and use it.
🚦 3. Semaphore✅ What is it?A synchronization primitive that limits the number of threads that can access a resource simultaneously.
Useful for managing a pool of limited resources.
🧠 Key Points:Semaphore can be used within the same process.
SemaphoreSlim is a lightweight version used in .NET for intra-process scenarios.
Semaphore can have more than one slot—unlike Mutex or lock.
🧪 Example:SemaphoreSlim semaphore = new SemaphoreSlim(3); // Allow 3 threads
await semaphore.WaitAsync();try{ // Code where up to 3 threads can execute in parallel}finally{ semaphore.Release();}
🧭 Analogy:Imagine a parking lot with 3 spaces. Only 3 cars (threads) can park at the same time. Others must wait until a spot is freed.
lock
System.Threading.Mutex
Semaphore
SemaphoreSlim
💡 When to Use What?
Scenario UseYou want to synchronize access to a method/section within the same app ✅ lockYou want to synchronize across multiple apps/processes ✅ MutexYou want to limit concurrent access (like a thread pool or connection pool) ✅ Semaphore
🔥 Pro Tip to Impress the Interviewer:“While lock is the easiest and fastest way to synchronize access in a single process, Mutex allows cross-process communication at the cost of performance. On the other hand, Semaphore is powerful when managing a bounded number of threads, like when building a thread-safe resource pool or controlling access to a limited service like DB connections.”